poj 3468 A Simple Problem with Integers

题意:这道题是个标准的成段更新的线段树。

复制代码
View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<iostream>
 4 #include<string>
 5 #include<queue>
 6 #include<map>
 7 #include<cmath>
 8 #include<stack>
 9 #include<algorithm>
10 #include<functional>
11 using namespace std;
12 //1.bulid();
13 //2.query(a,b)
14 //3.update(a,b)
15 #define lson l , m , rt << 1
16 #define rson m + 1 , r , rt << 1 | 1
17 typedef long long LL;
18 const int maxn = 100055;
19 LL sign[maxn<<2];
20 LL sum[maxn<<2];
21 int n;
22 //根据题意做相关修改,询问时的操作 
23 LL operate(LL a,LL b){
24     return a+b;
25 }
26 void PushUp(int rt){
27     sum[rt]=operate(sum[rt<<1],sum[rt<<1|1]);
28 }
29 void PushDown(int rt,int m) {
30     if (sign[rt]) {
31         sign[rt<<1]   += sign[rt];
32         sign[rt<<1|1] += sign[rt];
33         sum[rt<<1] += (m - (m >> 1)) * sign[rt];
34         sum[rt<<1|1] += (m >> 1) * sign[rt];
35         sign[rt] = 0;
36     }
37 }
38 void bulid(int l=1,int r=n,int rt=1){
39     sign[rt] = 0;
40     if(l==r){// 据题意做相关修改
41         scanf("%lld",&sum[rt]);return ;
42     }
43     int m=(l+r)>>1;
44     bulid(lson);
45     bulid(rson);
46     PushUp(rt);
47 }
48 void update(int L,int R,int add,int l=1,int r=n,int rt=1){
49     if(L<=l && r<=R){// 据题意做相关修改
50         sign[rt]+=add;
51             sum[rt]+=(LL)add*(r-l+1);return ;
52     }
53     PushDown(rt,r-l+1);
54     int m = (l + r) >> 1;
55     if (L <= m) update(L , R , add , lson);
56     if (R > m) update(L , R , add , rson);
57     PushUp(rt);
58 }
59 LL query(int L,int R,int l=1,int r=n,int rt=1) {
60     if (L <= l && r <= R) {
61         return sum[rt];
62     }
63     PushDown(rt , r - l + 1);
64     int m = (l + r) >> 1;
65     LL ret = 0;
66     if (L <= m) ret += query(L , R , lson);
67     if (m < R) ret += query(L , R , rson);
68     return ret;
69 }
70 
71 int main()
72 {
73     int m,x,y,z;
74     char op[2];
75     while(~scanf("%d%d",&n,&m)){
76         bulid();
77         while(m--){
78             scanf("%s",op);
79             if(op[0]=='Q'){
80                 scanf("%d%d",&x,&y);
81                 printf("%lld\n",query(x,y));
82             }else{
83                 scanf("%d%d%d",&x,&y,&z);
84                 update(x,y,z);
85             }
86             
87         }
88     }
89     
90     return 0;
91 }
复制代码
posted on   tiankonguse  阅读(170)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示