您的位置:首页 > 其它

HDU 1166 敌兵布阵(线段树基础)

2015-02-07 14:10 405 查看
中文体面...考察线段树基本操作单点更新,区间查询...因为手边没有以前用的模板,然后就自己写了一个,估计写的比较挫....

PS:并差集和剩下的最短路四道题好难的样子...然后就来到了线段树...

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
struct node
{
int l,r,x;
} data[300000];
void build(int l,int r,int k)
{
data[k].l=l;
data[k].r=r;
if(l==r)
{
int x;
scanf("%d",&x);
data[k].x=x;
return ;
}
int mid=(l+r)>>1;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
data[k].x=data[k*2].x+data[k*2+1].x;
}
void add(int c,int k,int x)
{
if(data[k].l==c&&data[k].l==data[k].r)
{
data[k].x+=x;
return ;
}
if(c<data[k].l||c>data[k].r)
return ;
add(c,k*2,x);
add(c,k*2+1,x);
data[k].x=data[k*2].x+data[k*2+1].x;
}
int query(int l,int r,int k)
{
if(data[k].l==l&&data[k].r==r)
return data[k].x;
if(data[k].l>r||data[k].r<l)
return 0;
int mid=(data[k].r+data[k].l)>>1;
if(r<=mid)
return query(l,r,k*2);
else if(l>=mid+1)
return query(l,r,k*2+1);
else
return query(l,mid,k*2)+query(mid+1,r,k*2+1);
}
int main()
{
int T,n;
scanf("%d",&T);
for(int cas=1; cas<=T; cas++)
{
scanf("%d",&n);
build(1,n,1);
char s[300];
printf("Case %d:\n",cas);
while(scanf("%s",s),s[0]!='E')
{
int x,y;
scanf("%d %d",&x,&y);
if(s[0]=='A')
add(x,1,y);
else if(s[0]=='S')
add(x,1,-y);
else if(s[0]=='Q')
printf("%d\n",query(x,y,1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: