线段树成段更新 poj 3468 A Simple Problem with Integers

 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 }
View Code

 

 

posted on 2013-05-25 17:13  jumpingfrog0  阅读(291)  评论(0编辑  收藏  举报

导航