您的位置:首页 > 其它

hdu 1166 敌兵布阵

2011-08-07 19:23 288 查看
这个题目很快敲出来,但是还是出现一点问题。就是在写Query函数的时候,我定义函数的类型为int类型。直接返回结果就不对了。后来想想了想,因为线段树回溯的时候,会有合并操作。我那样返回值,值返回的是某个区间上的值,不是真正我想要的结果。这一点也提醒我写段树的所有函数的时候,最好都写成无返回值类型。如果真想得到某个值,可以定义全局变量,在函数中累加就行了。有了递归,很多情况就打不一样了!

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 60000
struct SegTree
{
int l,r,mid;
int sum;
}tree[N*3];
int s
,sum;
void BuildTree(int root,int l,int r)
{
tree[root].l=l;
tree[root].r=r;
tree[root].mid=(l+r)/2;
if(l==r)
{
tree[root].sum=s[l];
return;
}
BuildTree(2*root,l,tree[root].mid);
BuildTree(2*root+1,tree[root].mid+1,r);
tree[root].sum=tree[2*root].sum+tree[2*root+1].sum;
}
void Query(int root,int l,int r)
{
if(tree[root].l==l&&tree[root].r==r)
{
sum+=tree[root].sum;
return ;
}
if(l>tree[root].mid)
{
Query(2*root+1,l,r);
}
else if(r<=tree[root].mid)
{
Query(2*root,l,r);
}
else
{
Query(2*root,l,tree[root].mid);
Query(2*root+1,tree[root].mid+1,r);
}
}
void Updata(int root,int a,int b)
{
tree[root].sum+=b;
if(tree[root].l==tree[root].r)return;
if(a<=tree[root].mid)Updata(2*root,a,b);
else Updata(2*root+1,a,b);
}
int main()
{
int t;
int cn=0;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
BuildTree(1,1,n);
char ch[30];
printf("Case %d:\n",++cn);
while(scanf("%s",ch)!=EOF)
{
int a,b;
if(strcmp(ch,"End")==0)break;
scanf("%d%d",&a,&b);
if(strcmp(ch,"Query")==0)
{
sum=0;
Query(1,a,b);
printf("%d\n",sum);
}
else if(strcmp(ch,"Add")==0)
{
Updata(1,a,b);
}
else
{
Updata(1,a,-b);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: