您的位置:首页 > 其它

HDU 1166 敌兵布阵

2012-08-09 21:14 204 查看
线段树。代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#define max 50002

using namespace std;

typedef struct
{
int l, r;
int val;
}node;

node w[4*max];

void pushup(int rt)
{
w[rt].val=w[rt<<1].val+w[rt<<1|1].val;
}

void build(int l, int r, int rt)
{
w[rt].l=l;
w[rt].r=r;
if (l == r)
{
scanf("%d", &w[rt].val);
return ;
}
int m=(l+r)>>1;
build(l, m, rt<<1);
build(m+1, r, rt<<1|1);
pushup(rt);
}

void update(int p, int v, int rt)
{
if (w[rt].l ==  w[rt].r)
{
w[rt].val+=v;
return ;
}
int m=(w[rt].l+w[rt].r)>>1;
if (p <= m) update(p, v, rt<<1);
else update(p, v, rt<<1|1);
pushup(rt);
}

int query(int L, int R, int rt)
{
if (w[rt].l == L && w[rt].r == R)
return w[rt].val;
int m=(w[rt].l+w[rt].r)>>1;
if (L > m)
{
return query(L, R, rt<<1|1);
}
else if (R <= m)
{
return query(L, R, rt<<1);
}
else
{
return query(L, m, rt<<1)+query(m+1, R, rt<<1|1);
}
}

int main()
{
int T, n, i, a, b;
char s[10];
scanf("%d", &T);
for (i=1; i<=T; i++)
{
printf("Case %d:\n", i);
scanf("%d", &n);
build(1, n, 1);
while(scanf("%s", s), s[0] != 'E')
{
if (s[0] == 'A')
{
scanf("%d%d", &a, &b);
update(a, b, 1);
}
else if (s[0] == 'S')
{
scanf("%d%d", &a, &b);
update(a, -b, 1);
}
else if (s[0] == 'Q')
{
scanf("%d%d", &a, &b);
printf("%d\n", query(a, b, 1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: