您的位置:首页 > 其它

HDU 1166 敌兵布阵 线段树,单点更新

2012-08-10 21:53 357 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

代码

View Code

#include <stdio.h>
#include <string.h>
#define maxn 50000*4+5
struct node {
int l,r,val;
}tr[maxn];
void pushup(int rt)
{
tr[rt].val = tr[rt*2].val+tr[rt*2+1].val;
return;
}
void build(int l,int r,int rt)
{
tr[rt].l = l;
tr[rt].r = r;
if(r == l)
{
scanf("%d",&tr[rt].val);
return;
}
int m;
m = (r+l)/2;
build(l,m,rt*2);
build(m+1,r,rt*2+1);
pushup(rt);
}
void update(int target,int val,int rt)
{
int m;
if(tr[rt].l == tr[rt].r){
tr[rt].val += val;
return;
}
m = (tr[rt].l+tr[rt].r)/2;
if(target > m)
update(target,val,rt*2+1);
else
update(target,val,rt*2);
pushup(rt);
return;
}
int ask(int l,int r,int rt)
{
if(tr[rt].l == l&& r == tr[rt].r)
return tr[rt].val;
int m;
m = (tr[rt].l+tr[rt].r)/2;
if(l > m)
return ask(l,r,rt*2+1);
else if(r <= m)
return ask(l,r,rt*2);
else
return ask(l,m,rt*2)+ask(m+1,r,rt*2+1);
}
int main()
{
int t;
scanf("%d",&t);
int cas = 0;
while(t--)
{
cas++;
printf("Case %d:\n",cas);
int n,i,j,k;
char order[20];
scanf("%d",&n);
build(1,n,1);
while(~scanf("%s",order))
{
if(order[0] == 'E')
break;
scanf("%d %d",&i,&j);
if(order[0] == 'A')
update(i,j,1);
else if(order[0] == 'S')
update(i,-j,1);
else
printf("%d\n",ask(i,j,1));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: