poj 3468 A Simple Problem with Integers
题目链接:http://poj.org/problem?id=3468
题目大意:给出n个数,A1,A2,.....An,给出q个操作,
C a b c 表示第a个数到第b个数都加上c
Q a b 表示询问第a个数到第b个数的和
线段树成段更新:update:成段增减 query:区间求和
pushup:把当前结点的信息更新到父结点
pushdown:把当前结点的信息更新给儿子结点
注意:用到int64
代码如下:
1 #include<stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define N 100010 5 __int64 tree[N<<2],add[N<<2]; 6 void pushup(int rt) 7 { 8 tree[rt]=tree[rt<<1]+tree[rt<<1|1]; 9 } 10 void pushdown(int rt,int m) 11 { 12 if(add[rt]) 13 { 14 add[rt<<1]+=add[rt]; 15 add[rt<<1|1]+=add[rt]; 16 tree[rt<<1]+=add[rt]*(m-(m>>1)); 17 tree[rt<<1|1]+=add[rt]*(m>>1); 18 add[rt]=0; 19 } 20 } 21 void build(int l,int r,int rt) 22 { 23 add[rt]=0; 24 if(l==r) 25 { 26 scanf("%I64d",&tree[rt]); 27 return ; 28 } 29 int m=(l+r)>>1; 30 build(lson); 31 build(rson); 32 pushup(rt); 33 } 34 void update(int L,int R,int c,int l,int r,int rt) 35 { 36 if(L<=l&&R>=r) 37 { 38 add[rt]+=c; 39 tree[rt]+=c*(r-l+1); 40 return ; 41 } 42 pushdown(rt,r-l+1); 43 int m=(l+r)>>1; 44 if(L<=m) 45 update(L,R,c,lson); 46 if(R>m) 47 update(L,R,c,rson); 48 pushup(rt); 49 } 50 __int64 query(int L,int R,int l,int r,int rt) 51 { 52 if(L<=l&&R>=r) 53 return tree[rt]; 54 pushdown(rt,r-l+1); 55 int m=(l+r)>>1; 56 __int64 ret=0; 57 if(L<=m) 58 ret+=query(L,R,lson); 59 if(R>m) 60 ret+=query(L,R,rson); 61 return ret; 62 } 63 int main() 64 { 65 int n,q,a,b,c; 66 char s[2]; 67 scanf("%d%d",&n,&q); 68 build(1,n,1); 69 while(q--) 70 { 71 scanf("%s",s); 72 if(s[0]=='Q') 73 { 74 scanf("%d%d",&a,&b); 75 printf("%I64d\n",query(a,b,1,n,1)); 76 } 77 else 78 { 79 scanf("%d%d%d",&a,&b,&c); 80 update(a,b,c,1,n,1); 81 } 82 } 83 return 0; 84 }