线段树的经典入门题:
#include<stdio.h>
struct node
{
int l;
int r;
int val;
};
node tree[1000002];
int a[50010];
char oper[9];
int n;
void build(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].val=0;
if(tree[i].l==tree[i].r)
{
tree[i].val=a[l];
return;
}
int mid=(l+r)/2;
build(2*i,l,mid);
build(2*i+1,mid+1,r);
tree[i].val=tree[2*i].val+tree[2*i+1].val;
}
int qurry(int i,int t,int k)
{
if(tree[i].l==t&&tree[i].r==k)
{
return tree[i].val;
}
int mid=(tree[i].l+tree[i].r)/2;
if(mid>=k) return qurry(2*i,t,k);
else if (t>mid) return qurry(2*i+1,t,k);
else return (qurry(2*i,t,mid)+qurry(2*i+1,mid+1,k));
}
void updata(int i,int t,int add)
{
if(tree[i].l==tree[i].r&&tree[i].r==t)
{
tree[i].val+=add;
return;
}
int mid=(tree[i].l+tree[i].r)/2;
if(mid>=t) updata(2*i,t,add);
else updata(2*i+1,t,add);
tree[i].val=tree[2*i].val+tree[2*i+1].val;
}
int main()
{
int cas=0;
int x,y;
int test;
scanf("%d",&test);
while(test--)
{
cas++;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
printf("Case %d:\n",cas);
while(scanf("%s",oper))
{
if(oper[0]=='Q')
{
scanf("%d%d",&x,&y);
int ans=qurry(1,x,y);
printf("%d\n",ans);
continue;
}
else if(oper[0]=='A')
{
scanf("%d%d",&x,&y);
updata(1,x,y);
continue;
}
else if(oper[0]=='S')
{
scanf("%d%d",&x,&y);
updata(1,x,-1*y);
continue;
}
else
{ break;
}
}
}
return 0;
}
hdu 1166 敌兵布阵
最新推荐文章于 2019-01-24 21:53:19 发布
