题目连接:http://poj.org/problem?id=3468
题目大意:输入N,和Q,代表n个数字和q个操作,然后输入n个数字,然后再输入q个操作,Q代表求询问a,b编号之间的和(包含),C代表把a,b,之间的数都加上c。
代码:
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 100000*4+50 4 struct node 5 { 6 __int64 num; 7 __int64 lazy;//lazy标记 8 }tr[maxn]; 9 __int64 count; 10 void pushup(__int64 rt) 11 { 12 tr[rt].num = tr[rt<<1].num+tr[rt<<1|1].num; 13 } 14 void build(__int64 l,__int64 r,__int64 rt) 15 { 16 if(l == r)//l r基本上就相当于编号~ 17 { 18 scanf("%I64d",&tr[rt].num); 19 tr[rt].lazy = 0;//一定让他先为零 20 return; 21 } 22 __int64 m = (l+r)>>1; 23 build(l,m,rt<<1); 24 build(m+1,r,rt<<1|1); 25 pushup(rt); 26 return; 27 } 28 void pushdown(__int64 rt,__int64 len) 29 { 30 if(tr[rt].lazy) 31 { 32 tr[rt<<1].lazy += tr[rt].lazy;//一定要是+=哦,因为加法德查询区域为1,3的话,这个lazy标记到1,3就不走了,只有当它再次被询问的时候才往下走。。 33 tr[rt<<1|1].lazy += tr[rt].lazy; 34 tr[rt<<1].num += (len-(len>>1))*tr[rt].lazy; 35 tr[rt<<1|1].num += (len>>1)*tr[rt].lazy; 36 tr[rt].lazy = 0; 37 } 38 return; 39 } 40 void update(__int64 lx,__int64 rx,__int64 l,__int64 r,__int64 val,__int64 rt) 41 { 42 if(lx <= l && rx >= r) 43 { 44 tr[rt].num += val*(r-l+1); 45 tr[rt].lazy += val; 46 return; 47 } 48 pushdown(rt,r-l+1); 49 __int64 m = (l+r)>>1; 50 if(lx <= m) 51 update(lx,rx,l,m,val,rt<<1); 52 if(rx > m) 53 update(lx,rx,m+1,r,val,rt<<1|1); 54 pushup(rt); 55 return; 56 } 57 __int64 ask(__int64 lx,__int64 rx,__int64 l,__int64 r,__int64 rt) 58 { 59 __int64 sum; 60 sum = 0; 61 if(lx <= l && rx >= r) 62 return tr[rt].num; 63 64 pushdown(rt,r-l+1);//询问的时候把lazy往下延伸 65 66 __int64 m = (l+r)>>1; 67 if(lx <= m)//区域不要搞错 68 sum+=ask(lx,rx,l,m,rt<<1); 69 if(rx > m) 70 sum+=ask(lx,rx,m+1,r,rt<<1|1); 71 return sum; 72 } 73 int main() 74 { 75 __int64 n,q,i,j,k; 76 scanf("%I64d %I64d",&n,&q); 77 char order[5]; 78 build(1,n,1); 79 while(q--) 80 { 81 scanf("%s",order); 82 if(order[0] == 'Q') 83 { 84 __int64 x,y; 85 scanf("%I64d %I64d",&x,&y);; 86 printf("%I64d\n",ask(x,y,1,n,1)); 87 } 88 else 89 { 90 __int64 x,y,val; 91 scanf("%I64d %I64d %I64d",&x,&y,&val); 92 update(x,y,1,n,val,1); 93 } 94 } 95 return 0; 96 }