码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1166

时间:2018-07-21 21:34:02      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:oal   code   pre   http   完全   print   pac   main   树状数组   

题目链接: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:\n",kkk++);
83         for(int i=1;i<=num;i++){
84             printf("%d\n",ans[i]);
85         }
86     }
87     return 0;
88 }

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

hdu 1166

标签:oal   code   pre   http   完全   print   pac   main   树状数组   

原文地址:https://www.cnblogs.com/ZQUACM-875180305/p/9347853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!