简单看了线段树的点更新什么的,后来发现还有成段更新。然后今天中午踢完球回来就开始死磕,终于把1698给AC了,然后还知道google ”pudge“,出来的全是dota里面的屠夫啊。哈哈,小娱乐。
就是col数组是延迟更新。别的我也不说了,我会加在代码里面。
1 #include <stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 200000+10 5 int col[maxn<<2]; 6 int sum[maxn<<2]; 7 void PushUp(int rt) 8 { 9 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 10 } 11 void PushDown(int rt,int m) 12 { 13 if(col[rt]) 14 { 15 col[rt<<1]=col[rt<<1|1]=col[rt]; //将此处概括的信息传递给下面 16 sum[rt<<1]=(m-(m>>1))*col[rt]; //因为建树的关系,所以左子树会比右子树多一些 17 sum[rt<<1|1]=(m>>1)*col[rt]; 18 col[rt]=0; //因为出现分歧了,所以不能概括该区间的颜色了 19 } 20 } 21 void build(int l,int r,int rt) 22 { 23 col[rt]=0; 24 sum[rt]=1; 25 if(l==r) 26 return; 27 int m=(l+r)>>1; 28 build(lson); 29 build(rson); 30 PushUp(rt); 31 } 32 void update(int L,int R,int c,int l,int r,int rt) 33 { 34 if(L<=l&&r<=R) 35 { 36 col[rt]=c; 37 sum[rt]=c*(r-l+1); 38 return; 39 } 40 PushDown(rt,r-l+1); //先散下去,如果col[rt]为0的话则不用再散啦j 41 int m=(r+l)>>1; 42 if(L<=m) 43 update(L,R,c,lson); 44 if(R>m) 45 update(L,R,c,rson); 46 PushUp(rt); //散下去以后必然要收上来(指sum值,col值就不管了,col值只能从上往下传~) 47 } 48 int main() 49 { 50 int t,n,m,i,j; 51 int t1,t2,t3; 52 int cas=1; 53 scanf("%d",&t); 54 while(t--) 55 { 56 scanf("%d",&n); 57 build(1,n,1); 58 scanf("%d",&m); 59 while(m--) 60 { 61 scanf("%d%d%d",&t1,&t2,&t3); 62 update(t1,t2,t3,1,n,1); 63 } 64 printf("Case %d: The total value of the hook is %d.\n",cas++,sum[1]); 65 } 66 return 0; 67 }