Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9758 Accepted Submission(s): 4776
1 #include<stdio.h> 2 const int maxn=100050; 3 int sumv[maxn<<2]; 4 int setv[maxn<<2]; 5 void pushup(int rt){///更新当前值 6 sumv[rt]=sumv[rt<<1]+sumv[rt<<1|1]; 7 } 8 void pushdown(int rt,int x){///当此节点改变时,更新此节点,并且传递至下一节点 9 int lc=rt<<1,rc=rt<<1|1,mid=x>>1; 10 if(setv[rt]>=0){ 11 setv[rt<<1]=setv[rt<<1|1]=setv[rt]; 12 sumv[lc]=(x-mid)*setv[rt]; 13 sumv[rc]=mid*setv[rt]; 14 setv[rt]=-1; 15 } 16 } 17 void creat(int l,int r,int rt){///特有的建树,因为已经题中总要初始化 18 setv[rt]=-1; 19 sumv[rt]=1; 20 if(l == r) return ; 21 int mid=(l+r)>>1; 22 creat(l,mid,rt<<1); 23 creat(mid+1,r,rt<<1|1); 24 pushup(rt);///每一个节点在子节点建立完成更新 25 } 26 void update(int l,int r,int x,int L,int R,int rt){///数据更新 27 if(l<=L&&r>=R){///当次节点完全覆盖了要更新区间一部分时在次子树的更新结束 28 setv[rt]=x;///更新进程结束 29 sumv[rt]=x*(R-L+1); 30 return ; 31 } 32 pushdown(rt,R-L+1);///更新数据下移并消除此节点的 33 int mid=(L+R)>>1; 34 if(l<=mid) update(l,r,x,L,mid,rt<<1);///如左边有更新,则更新左边 35 if(r>mid) update(l,r,x,mid+1,R,rt<<1|1);///右边有更新则更新右边 36 37 pushup(rt);///更新此节点 38 } 39 int main() 40 { 41 int t, n,q; 42 int k=1; 43 int a,b,c; 44 scanf("%d",&t); 45 while(t--){ 46 scanf("%d%d",&n,&q); 47 creat(1,n,1); 48 49 for(int i=0;i<q;i++){ 50 scanf("%d%d%d",&a,&b,&c); 51 update(a,b,c,1,n,1); 52 /* for(int j=1;j<20;j++){ 53 printf("a%d = %d\n",j,sumv[j]);}*/ 54 } 55 printf("Case %d: The total value of the hook is %d.\n",k++,sumv[1]); 56 57 } 58 }