hdu 2068
#include<bits/stdc++.h>
using namespace std;
//用线段树维护一个2*2的矩阵,a[i][j]表示从这一层第i个门到下一层第j个门是否联通,
//第i层到第j层之间的矩阵相乘之后的结果矩阵,各元素和为从第i层到第j层的种类数
const int mod=1000000007;
struct mat{
long long a[2][2];
}tr[400005];
mat mul(mat x,mat y)
{
mat ne;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
ne.a[i][j]=0;
for(int k=0;k<2;k++)
{
ne.a[i][j]=(ne.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
}
}
}
return ne;
}
void build(int i,int l,int r)
{
if(l==r)
{
for(int ii=0;ii<2;ii++)
{
for(int j=0;j<2;j++)
tr[i].a[ii][j]=1;
}
return ;
}
int mid=l+r>>1;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tr[i]=mul(tr[i*2],tr[i*2+1]);
}
void update(int i,int l,int r,int x,int y,int z)
{
if(l==r)
{
tr[i].a[y][z]^=1;
return ;
}
int mid=

本文介绍了如何运用线段树和矩阵乘法解决HDU 5068以及2019年牛客网暑假多校训练赛E题中的算法问题,详细阐述了这两种数据结构和技术在实际题目中的应用和结合方法。

169

被折叠的 条评论
为什么被折叠?



