点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=1166
题意在这里我就不说了,感觉好坑啊,因为最后的输出格式就一直错因为,我没有加 :这个符号
这是简单的线段树题,主要就体现了,建树 ,更新,查询的功能,不是太理解,看模板打下来的。还能算是理解点,以后慢慢深入吧
嘿 ,看我的代码,希望能够帮助你哦 !!!!!!!!
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
const int N=50005;
int n,num[N],cnt;
char ss[20];
int Sum;
struct node
{
int l;
int r;
int sum;
}tree[4*N]; 因为线段树是完全的二叉树,这样一来,所占的内存就会大的,所以线段数组要开打四倍
void build(int x,int y,int n)//基本的建树 ,这个建树呢,把其中的数据值 赋值到了线段树数组上,也不错
{
tree[n].l=x;
tree[n].r=y;
if(x==y)
{
tree[n].sum=num[x];
return ;
}
int mid=(x+y)/2;
build(x,mid,2*n);
build(mid+1,y,2*n+1);
tree[n].sum=tree[n*2].sum+tree[n*2+1].sum;//回溯,更新父节点的值
}
void update(int x,int v,int n)//这个函数就是更新啦
{
if(tree[n].l==x&&tree[n].r==x)
{
tree[n].sum+=v;
return ;
}
int mid=(tree[n].l+tree[n].r)/2;
if(x<=mid)
{
update(x,v,2*n);
}
else
{
update(x,v,2*n+1);
}
tree[n].sum=tree[n*2].sum+tree[n*2+1].sum;
}
void query(int x,int y,int n)
{
int mid=(tree[n].l+tree[n].r)/2;
if(tree[n].l==x&&tree[n].r==y)
{
Sum+=tree[n].sum;
}
else if(x>mid)
{
query(x,y,2*n+1);
}
else if(mid>=y)
{
query(x,y,2*n);
}
else
{
query(x,mid,2*n);
query(mid+1,y,2*n+1);
}
}
int main()
{
int t;
scanf("%d",&t);
cnt=1;
int x,y;
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
build(1,n,1);
printf("Case %d:\n",cnt++);
while(1)
{
Sum=0;
scanf("%s",ss);
if(ss[0]=='Q')
{
scanf("%d%d",&x,&y);
query(x,y,1);
printf("%d\n",Sum);
}
else if(ss[0]=='A')
{
scanf("%d%d",&x,&y);
update(x,y,1);
}
else if(ss[0]=='S')
{
scanf("%d%d",&x,&y);
update(x,-y,1);
}
else
{
break;
}
}
}
return 0;
}