您的位置:首页 > 其它

HDU 1166 (敌兵布阵)

2015-07-13 16:23 274 查看
线段树,更新,区间求和。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxx 50005
int sum[maxx<<2];
int n;
void pushplus(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushplus(rt);
}
int query(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return sum[rt];
int m=(l+r)>>1;
int ans=0;
if(left<=m)
{
ans+=query(left,right,lson);
}
if(right>m)
{
ans+=query(left,right,rson);
}
return ans;
}
void update(int p,int add,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=sum[rt]+add;
return ;
}
int m=(l+r)>>1;
if(p<=m)
update(p,add,lson);
else
update(p,add,rson);
pushplus(rt);

}
int main()
{
int t;
string s;
int a,b;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
printf("Case %d:\n",i);
scanf("%d",&n);
build(1,n,1);
while(cin>>s&&s[0]!='E')
{
scanf("%d%d",&a,&b);
if(s[0]=='Q')
printf("%d\n",query(a,b,1,n,1));
if(s[0]=='A')
update(a,b,1,n,1);
else if(s[0]=='S')
update(a,-b,1,n,1);
}
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM HDU 线段树