poj3468A Simple Problem with Integers(线段树延时更新)

http://poj.org/problem?id=3468

题意:
    有n个整数A1,A2,……,An,给你两种操作,一个是给区间[l,r]的值都增加m,一个是问区间[l,r]的和是多少。

 1 #include <iostream>
 2 #include <cstdio>
 3 #define lson l,mid,i<<1
 4 #define rson mid+1,r,i<<1|1
 5 using namespace std;
 6 const int Ni = 100010;
 7 long long tree[Ni*3];
 8 long long add[Ni*3];
 9 int n;
10 void build(int l=1,int r=n,int i=1)
11 {
12     add[Ni]=0;
13     if(l==r)
14     {
15         scanf("%I64d",tree+i);
16         return ;
17     }
18     int mid=(l+r)>>1;
19     build(lson);
20     build(rson);
21     tree[i]=tree[i<<1]+tree[i<<1|1];
22 }
23 inline void pushdown(int l,int r,int i)
24 {
25     if(add[i])
26     {
27         add[i<<1]+=add[i];
28         add[i<<1|1]+=add[i];
29         int mid=(l+r)>>1;
30         tree[i<<1]+=(mid-l+1)*add[i];
31         tree[i<<1|1]+=(r-mid)*add[i];
32         add[i]=0;
33     }
34 }
35 void update(int ql,int qr,int val,int l=1,int r=n,int i=1)
36 {
37 
38     if(ql<=l&&r<=qr)
39     {
40         add[i]+=val;
41         tree[i]+=(r-l+1)*val;
42         return ;
43     }
44     int mid=(l+r)>>1;
45     pushdown(l,r,i);
46     if(ql<=mid) update(ql,qr,val,lson);
47     if(qr>mid) update(ql,qr,val,rson);
48     tree[i]=tree[i<<1]+tree[i<<1|1];
49 }
50 long long query(int ql,int qr,int l=1,int r=n,int i=1)
51 {
52 
53     long long ret=0;
54     if(ql<=l&&r<=qr)
55     {
56         return tree[i];
57     }
58     int mid=(l+r)>>1;
59     pushdown(l,r,i);
60     if(ql<=mid) ret+=query(ql,qr,lson);
61     if(qr>mid) ret+=query(ql,qr,rson);
62     return ret;
63 }
64 int main()
65 {
66     int m;
67     //freopen("fin.txt","r",stdin);
68     while(~scanf("%d%d",&n,&m))
69     {
70         build();
71         for(int i=0;i<m;i++)
72         {
73             char ch[5];
74             int ql,qr,val;
75             scanf("%s",ch);
76             if(ch[0]=='Q')
77             {
78                 scanf("%d%d",&ql,&qr);
79                 printf("%I64d\n",query(ql,qr));
80             }
81             else
82             {
83                 scanf("%d%d%d",&ql,&qr,&val);
84                 update(ql,qr,val);
85             }
86         }
87     }
88     return 0;
89 }


10 22
1 2 3 4 5 6 7 8 9 10
Q 4 4
C 1 10 3
C 6 10 3
C 6 9 3
C 8 9 -100
C 7 9 3
C 7 10 3
C 1 10 3
Q 6 10
Q 6 9
Q 8 9
Q 7 9
Q 7 10
Q 1 10
Q 2 4
C 3 6 3
Q 9 9
Q 1 1
Q 5 5
Q 6 6
Q 7 7
Q 6 8

5 5
1000000000 1000000000 1000000000 1000000000 1000000000
Q 1 2
Q 3 3
Q 5 5
C 1 2 1000000000
C 1 5 1000000000
C 1 5 1000000000
Q 1 2
Q 4 5

ans:
4
-82
-104
-147
-122
-100
-37
27
-73
7
14
21
25
-28
2000000000
1000000000
1000000000
8000000000
6000000000

原文地址:https://www.cnblogs.com/qijinbiao/p/2622298.html