hdu1116敌兵布阵
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1116敌兵布阵相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
单点更新,区间求和。
1 #include<cstdio> 2 #include<cstring> 3 const int m=50005; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 7 int sum[m<<2]; 8 9 inline void pushplus(int rt) 10 { 11 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 12 } 13 14 void build (int l,int r,int rt) 15 { 16 if(l==r) 17 { 18 scanf("%d",&sum[rt]); 19 return; 20 } 21 int m=(l+r)>>1; 22 build(lson); 23 build(rson); 24 pushplus(rt); 25 } 26 27 void update(int p,int add,int l,int r,int rt) 28 { 29 if(l==r) { 30 sum[rt]+=add; 31 return; 32 } 33 int m=(l+r)>>1; 34 if(p<=m) update(p,add,lson); 35 else update(p,add,rson); 36 pushplus(rt); 37 } 38 39 int query(int L,int R,int l,int r,int rt) 40 { 41 if(L<=l&&r<=R) 42 { 43 return sum[rt]; 44 } 45 int ans=0; 46 int m=(l+r)>>1; 47 if(L<=m) ans+=query(L,R,lson); 48 if(R>m) ans+=query(L,R,rson); 49 return ans; 50 } 51 52 int main() 53 { 54 int t,n,a,b; 55 scanf("%d",&t); 56 for(int i=1;i<=t;i++) 57 { 58 printf("Case %d:\n",i); 59 scanf("%d",&n); 60 build(1,n,1); 61 char s[8]; 62 while(scanf("%s",s)&&s[0]!=‘E‘) 63 { 64 scanf("%d%d",&a,&b); 65 if(s[0]==‘Q‘) printf("%d\n",query(a,b,1,n,1)); 66 else if(s[0]==‘S‘) update(a,-b,1,n,1); 67 else update(a,b,1,n,1); 68 } 69 } 70 return 0; 71 }
以上是关于hdu1116敌兵布阵的主要内容,如果未能解决你的问题,请参考以下文章