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

HDU1166 敌兵布阵

时间:2016-04-24 18:44:36      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

分析:单点更新,区间求和

 1 #include"cstdio"
 2 using namespace std;
 3 
 4 #define lson l,m,rt<<1
 5 #define rson m+1,r,rt<<1|1
 6 #define root 1,N,1
 7 const int maxn=50000+5;
 8 int sum[maxn<<2];
 9 int T,N,cas=0;
10 
11 void pushup(int rt)
12 {
13     sum[rt]=sum[rt<<1]+sum[rt<<1|1];
14 }
15 
16 void build(int l,int r,int rt)
17 {
18     if(l==r) {scanf("%d",&sum[rt]);return;}
19     int m=(l+r)>>1;
20     build(lson);
21     build(rson);
22     pushup(rt);
23 }
24 
25 void updata(int p,int add,int l,int r,int rt)
26 {
27     if(l==r) {sum[rt]+=add;return;}
28     int m=(l+r)>>1;
29     if(p<=m) updata(p,add,lson);
30     else updata(p,add,rson);
31     pushup(rt);
32 
33 }
34 
35 int query(int L,int R,int l,int r,int rt)
36 {
37     if(L<=l&&r<=R) return sum[rt];
38     int m=(l+r)>>1;
39     int ret=0;
40     if(L<=m) ret+=query(L,R,lson);
41     if(m<R) ret+=query(L,R,rson);
42     return ret;
43 }
44 
45 int main()
46 {
47     scanf("%d",&T);
48     while(T--)
49     {
50         scanf("%d",&N);
51         build(root);
52         int a,b;
53         char s[10];
54         printf("Case %d:\n",++cas);
55         while(scanf("%s",s)&&s[0]!=E)
56         {
57             scanf("%d%d",&a,&b);
58             if(s[0]==A) updata(a,b,root);
59             if(s[0]==S) updata(a,-b,root);
60             if(s[0]==Q) printf("%d\n",query(a,b,root));
61         }
62     }
63     return 0;
64 }

 

HDU1166 敌兵布阵

标签:

原文地址:http://www.cnblogs.com/nuc-gxg/p/5427499.html

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