您的位置:首页 > 其它

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

2011-09-28 13:38 411 查看
点更新线段树问题

//4671028 2011-09-28 12:40:35 Accepted 1166 78MS 1720K 2395 B G++ nkhelloworld
//4671030 2011-09-28 12:41:04 Accepted 1166 46MS 1764K 2395 B C++ nkhelloworld
//点更新线段树
#include <cstdio>
#define MAXN 50000
struct SEGMENTTREE
{
int left,right,sum;
}tree[MAXN*4];
int n;

void buildsegtree(int pos,int left,int right)
{
tree[pos].left = left;  tree[pos].right = right;
if(left==right)
{
scanf("%d",&tree[pos].sum);
return ;
}
int mid = (left+right)>>1;
buildsegtree(pos<<1,left,mid);
buildsegtree(pos<<1|1,mid+1,right);
tree[pos].sum = tree[pos<<1].sum + tree[pos<<1|1].sum;
}

void add(int root,int addpos,int num)
{
if(tree[root].left == tree[root].right)
{
tree[root].sum += num;
return ;
}
int mid = (tree[root].left + tree[root].right)>>1;
if(addpos <=mid)
{
add(root<<1,addpos,num);
}
else
{
add(root<<1|1,addpos,num);
}
tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
}

int query(int root,int a,int b)
{
int ans = 0;
if(tree[root].left == a && tree[root].right == b)
{
ans += tree[root].sum;
return ans;
}
int mid = (tree[root].left+tree[root].right)>>1;
if(a > mid)
{
ans = query(root<<1|1,a,b);
}
else if(b <= mid)
ans = query(root<<1,a,b);
else
{
ans = query(root<<1,a,mid) + query(root<<1|1,mid+1,b);
}
return ans;
}

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