您的位置:首页 > 其它

hdu--1166 线段树区间求和

2012-07-12 11:08 477 查看
线段树区间求和简单入门题目

对于每一次输入的数组序列建树

每一次增加减少操作为更新操作,更新过程每个端点的和都更新

#include <iostream>
#include <string>
using namespace std;
#define MAX 50010
int num[MAX];
struct SegTree
{
int left,right,value;
int calmid(){
return (left+right)/2;
}
}tt[MAX*3];

int bulid(int s,int t,int step)
{
tt[step].left=s;
tt[step].right=t;
if(tt[step].right==tt[step].left)
return tt[step].value=num[s];
int mid=tt[step].calmid();
return tt[step].value=bulid(s,mid,step*2)+bulid(mid+1,t,step*2+1);
}

void update(int id,int x,int step)
{
tt[step].value+=x;
if(tt[step].left==tt[step].right)
return;
int mid=tt[step].calmid();
if(id<=mid){
update(id,x,step*2);
}else update(id,x,step*2+1);
}

int query(int s,int t,int step)
{
if(s<=tt[step].left&&tt[step].right<=t)
return tt[step].value;
int mid=tt[step].calmid();
if(t<=mid){
return query(s,t,step*2);
}else if(s>mid){
return query(s,t,step*2+1);
}else return query(s,t,step*2)+query(s,t,step*2+1);
}

int main()
{
int T,N,a,b;
char c[10];
cin>>T;
for(int q=1;q<=T;q++)
{
memset(tt,0,sizeof(tt));
memset(num,0,sizeof(num));
cin>>N;
for(int i=1;i<=N;i++)
cin>>num[i];
bulid(1,MAX,1);
cout<<"Case "<<q<<":"<<endl;
while(cin>>c)
{
if(c[0]=='E')
break;
else cin>>a>>b;
if(c[0]=='A')
update(a,b,1);
else if(c[0]=='S')
update(a,-b,1);
else if(c[0]=='Q')
cout<<query(a,b,1)<<endl;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: