标签:des style blog http color io os ar java
矩阵乘法来进行所有路径的运算, 线段树来查询修改。 关键还是矩阵乘法的结合律。
Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 326 Accepted Submission(s): 89
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define MOD 1000000007 #define N 50050 struct node { __int64 g[2][2]; }; int n,m; int l[4*N],r[4*N]; node num[4*N]; void up(int s) { num[s].g[0][0]=0;num[s].g[0][1]=0; num[s].g[1][0]=0;num[s].g[1][1]=0; for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) num[s].g[i][j] = (num[s].g[i][j]+num[2*s].g[i][k]*num[2*s+1].g[k][j])%MOD; } node mul(node x,node y) { node s; s.g[0][0]=0; s.g[0][1]=0; s.g[1][0]=0; s.g[1][1]=0; for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) s.g[i][j]=( s.g[i][j]+x.g[i][k]*y.g[k][j])%MOD; return s; } void build(int tl,int tr,int s) { l[s]=tl; r[s]=tr; if(tl==tr) { num[s].g[0][0]=1; num[s].g[0][1]=1; num[s].g[1][0]=1; num[s].g[1][1]=1; return ; } int mid = (tl+tr)/2; build(tl,mid,2*s); build(mid+1,tr,2*s+1); up(s); } void update(int x,int y,int z,int s) { if(l[s]==x&&r[s]==x) { int tx,ty; if(y==1&&z==1) tx=0,ty=0; if(y==1&&z==2) tx=0,ty=1; if(y==2&&z==1) tx=1,ty=0; if(y==2&&z==2) tx=1,ty=1; if(num[s].g[tx][ty]==0) { num[s].g[tx][ty]=1; } else num[s].g[tx][ty]=0; return ; } int mid= (l[s]+r[s])/2; if(x<=mid) update(x,y,z,2*s); else update(x,y,z,2*s+1); up(s); } node ask(int a,int b,int s) { if(l[s]==a&&r[s]==b) { return num[s];//这里查询的不对 } int mid=(l[s]+r[s])/2; if(b<=mid) return ask(a,b,2*s); else if(a>mid) return ask(a,b,2*s+1); else { return mul(ask(a,mid,2*s),ask(mid+1,b,2*s+1)); } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { build(1,n-1,1); for(int i=0;i<m;i++) { int a,b,c,d; scanf("%d%d%d",&a,&b,&c); if(a==0) { node tmp=ask(b,c-1,1); printf("%I64d\n", (tmp.g[0][0]+tmp.g[0][1]+tmp.g[1][0]+tmp.g[1][1])%MOD ); } else { scanf("%d",&d); update(b,c,d,1); } } } return 0; }
标签:des style blog http color io os ar java
原文地址:http://www.cnblogs.com/chenhuan001/p/4041832.html