您的位置:首页 > 其它

hdu 1166 敌兵布阵

2015-09-23 17:21 423 查看
基本的线段树题目,练一下代码,此外代码中包括两个查询函数,思路有几点不同之处

#include <iostream>
#include <stdio.h>
#include <cstring>
#define MAXN 600000
using namespace std;
struct note
{
int rr,ll;
int s;
}q[MAXN*3];
int a[MAXN];
void build(int i,int l,int r)
{
q[i].rr=r;
q[i].ll=l;
if(r==l)
{
q[i].s=a[r];
return ;
}
int m=(r+l)/2;
build(i*2,l,m);
build(i*2+1,m+1,r);
q[i].s=q[i*2].s+q[i*2+1].s;
}
void add(int i,int t,int b)
{
q[i].s+=b;
if(q[i].ll==t&&t==q[i].rr)
{
//q[i].s+=b;
return ;
}
int m=(q[i].rr+q[i].ll)/2;
if(t<=m)
add(i*2,t,b);
else
add(i*2+1,t,b);
}
int query(int i,int l,int r)
{
if(q[i].ll==l&&q[i].rr==r)
return q[i].s;
int m=(q[i].rr+q[i].ll)/2;
if(r<=m)
return query(i*2,l,r);
else if(l>m)
return query(i*2+1,l,r);
else
return query(i*2,l,m)+query(i*2+1,m+1,r);
}
int Query(int i,int l,int r)
{
if(l<=q[i].ll&&r>=q[i].rr)
{
return q[i].s;
}

int mid=(q[i].ll+q[i].rr)>>1;
if(r<=mid)  return Query(i<<1,l,r);
else if(l>mid)   return Query(i<<1|1,l,r);
else  return Query(i<<1,l,r)+Query(i<<1|1,l,r);
}
int main()
{
// freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
int tmp=1;
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
printf("Case %d:\n",tmp++);
char ss[10];
while(scanf("%s",ss)!=EOF)
{
int x,y;
if(ss[0]=='E')
break;
if(ss[0]=='A')
{
scanf("%d%d",&x,&y);
add(1,x,y);
}
if(ss[0]=='S')
{
scanf("%d%d",&x,&y);
add(1,x,-y);
}
if(ss[0]=='Q')
{

scanf("%d%d",&x,&y);
// printf("%d%d",x,y);
int ans=query(1,x,y);
//printf("ss");
printf("%d\n",ans);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: