hdu 1166

Posted zquacm-875180305

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1166相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

线段树或者树状数组都可以做。

最近学线段树维护数据,所以我用线段树维护sum。

线段树实际上就是一个完全二叉树,用递归自顶向下进行访问。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int maxn=50006,maxm=40006;
 6 int a[maxn],ans[maxm];
 7 struct{
 8     int lef,rig,sum;
 9 } tree[maxn*4];
10 int n, ANS;
11 
12 void build(int x,int y,int now)
13 {
14     tree[now].lef=x;
15     tree[now].rig=y;
16     if(x==y){
17         scanf("%d",&tree[now].sum);
18         return ;
19     }
20     int mid=(x+y)>>1;
21     build( x, mid, now<<1);
22     build( mid+1, y, now<<1|1);
23     tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
24 }
25 
26 void add(int x,int y,int now,int goal,int add_num)
27 {
28     if(x==y){
29         tree[now].sum+=add_num;
30         return ;
31     }
32     int mid=(x+y)>>1;
33     if(goal<=mid){
34         add( x, mid, now<<1, goal, add_num);
35     }
36     else{
37         add( mid+1, y, now<<1|1, goal, add_num);
38     }
39     tree[now].sum+=add_num;
40 }
41 
42 void query(int x,int y,int now, int eachx,int eachy)
43 {
44     if(x>=eachx&&y<=eachy){
45         ANS+=tree[now].sum;
46         return ;
47     }
48     int mid=(x+y)>>1;
49     if(mid>=eachy){
50         query( x, mid, now<<1, eachx, eachy);
51     }
52     else if(mid<eachx){
53         query( mid+1, y, now<<1|1, eachx, eachy);
54     }
55     else{
56         query( x, mid, now<<1, eachx, eachy);
57         query( mid+1, y, now<<1|1, eachx, eachy);
58     }
59 }
60 
61 int main()
62 {
63     int T,kkk=1;
64     scanf("%d",&T);
65     while(T--){
66         char order[10];
67         scanf("%d",&n);
68         int num=0;
69         build(1,n,1);
70         int x,y;
71         while( ~scanf("%s",order)){
72             if(order[0]==E) break;
73             scanf("%d%d",&x,&y);
74             if(order[0]==A) add(1,n,1,x,y);
75             if(order[0]==S) add(1,n,1,x,-y);
76             if(order[0]==Q){
77                 ANS=0;
78                 query( 1, n, 1, x, y);
79                 ans[++num]=ANS;
80             }
81         }
82         printf("Case %d:
",kkk++);
83         for(int i=1;i<=num;i++){
84             printf("%d
",ans[i]);
85         }
86     }
87     return 0;
88 }

最后因为一个等于号,调了一会。

以上是关于hdu 1166的主要内容,如果未能解决你的问题,请参考以下文章

HDU1166 敌兵布阵

[HDU 1166]敌兵布阵

ACM HDU 1166 敌兵布阵 简单的线段树 求区间和

HDU 1166 敌兵布阵 数据结构-树状数组-改点查段

A - 敌兵布阵 (HDU - 1166)

HDU1166 敌兵布阵