A - 敌兵布阵 HDU - 1166 线段树(多点修改当单点修改)

Posted ttttttttrx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A - 敌兵布阵 HDU - 1166 线段树(多点修改当单点修改)相关的知识,希望对你有一定的参考价值。

线段树板子题练手用

 1 #include<cstdio>
 2 using namespace std;
 3 const int maxn=5e4+8;
 4 int a[maxn],n;
 5 struct Node{
 6     int l,r;
 7     long long sum,lazy;
 8     void update(long long  val){
 9         sum+=1ll*(r-l+1)*val;
10         lazy+=val;
11     }
12 }tree[maxn*4];
13 void push_up(int x){
14     tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
15 }
16 void push_down(int x){
17     int lazyval=tree[x].lazy;
18     if(lazyval){
19         tree[x<<1].update(lazyval);
20         tree[x<<1|1].update(lazyval);
21         tree[x].lazy=0;
22     }
23 }
24 void build(int x,int l,int r){
25         tree[x].l=l,tree[x].r=r;
26         tree[x].sum=tree[x].lazy=0;
27         if(l==r){
28             tree[x].sum=a[l];
29         }
30         else {
31             int mid=l+r>>1;
32             build(x<<1,l,mid);
33             build(x<<1|1,mid+1,r);
34             push_up(x);
35         }
36 }
37 void update(int x,int l,int r,long long  val){
38     int L=tree[x].l,R=tree[x].r;
39     if(L>=l&&R<=r){
40         tree[x].update(val);
41     }
42     else {
43         int mid=L+R>>1;
44         push_down(x);
45         if(mid>=l)update(x<<1,l,r,val);
46         if(mid<r)update(x<<1|1,l,r,val);
47         push_up(x);
48     }
49 }
50 long long query(int x,int l,int r){
51     int L=tree[x].l,R=tree[x].r;
52     if(L>=l&&R<=r){
53         return tree[x].sum;
54     }
55     else {
56         int mid=L+R>>1;
57         long long ans=0;
58         push_down(x);
59         if(mid>=l)ans+=query(x<<1,l,r);
60         if(mid<r)ans+=query(x<<1|1,l,r);
61         push_up(x);
62         return ans;
63     }
64 }
65 int main(){
66     int t,kase=1;
67     scanf("%d",&t);
68     while(t--){
69         int n;
70         printf("Case %d:
",kase++);
71         scanf("%d",&n);
72         for(int i=1;i<=n;i++){
73             scanf("%d",&a[i]);
74         }
75         build(1,1,n);
76         char op[10];
77         while(scanf("%s",op)&&op[0]!=E){
78             if(op[0]==Q){
79                 int l,r;
80                 scanf("%d%d",&l,&r);
81                 printf("%lld
",query(1,l,r));
82             }
83             else if(op[0]==A){
84                 int l,r,c;
85                 scanf("%d%d",&l,&c);
86                 update(1,l,l,c);
87             }
88             else {
89                 int l,c;
90                 scanf("%d%d",&l,&c);
91                 update(1,l,l,-c);
92             }
93         }
94     }
95     return 0;
96 }

 

以上是关于A - 敌兵布阵 HDU - 1166 线段树(多点修改当单点修改)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1166 敌兵布阵 线段树

敌兵布阵 HDU - 1166 (线段树单点修改)

HDU - 1166 敌兵布阵(线段树)

HDU1166敌兵布阵(线段树单点更新)

HDU 1166 敌兵布阵(线段树或树状数组)

HDU 1166 敌兵布阵(线段树单点更新,板子题)