hdu1166(线段树模版,区间求和)
http://acm.hdu.edu.cn/showproblem.php?pid=1166
用线段树做,比树状数组费时
#include<iostream>
using namespace std;
const int N=50005;
struct
{
int left,right,num;
}s[4*N];
int data[N];
void build(int left,int right,int n)
{
int mid;
mid=(left+right)/2;
if(left==right)
{
s[n].left=left;
s[n].right=right;
s[n].num=data[left];
}
else
{
s[n].left=left;
s[n].right=right;
build(left,mid,n*2);
build(mid+1,right,n*2+1);
s[n].num=s[n*2].num+s[n*2+1].num;
}
}
int sum(int left,int right,int n)
{
int mid=(s[n].left+s[n].right)/2;
if(s[n].left==left&&s[n].right==right)
{
return s[n].num;
}
else
if(left>mid)
sum(left,right,n*2+1);
else
if(right<=mid)
sum(left,right,n*2);
else
return (sum(left,mid,n*2)+sum(mid+1,right,n*2+1));
}
void add(int i,int j,int n)
{
int mid=(s[n].left+s[n].right)/2;
if(s[n].left==i&&s[n].right==i)
{
s[n].num+=j;
int count=n/2;
while(count>=1)
{
s[count].num+=j;
count/=2;
}
}
else
if(i>mid)
add(i,j,n*2+1);
else
if(i<=mid)
add(i,j,n*2);
}
int main()
{
int t,f=0;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&data[i]);
build(1,n,1);
getchar();
printf("Case %d:\n",++f);
char s[10];
scanf("%s",s);
while(1)
{
if(s[0]=='Q')
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",sum(x,y,1));
}
else
if(s[0]=='A')
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y,1);
}
else
if(s[0]=='S')
{
int x,y;
scanf("%d%d",&x,&y);
add(x,-y,1);
}
else
if(s[0]=='E')
break;
getchar();
scanf("%s",s);
}
}
return 0;
}
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号