您的位置:首页 > 理论基础 > 数据结构算法

线段树-HDU 1166 敌兵布阵

2014-04-14 08:58 302 查看
一道线段树的基础入门题,这题得到一个教训····  字符串千万别cin输入   毁一生啊····

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include <algorithm>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define ll long long
#define eps 1e-8
#define ms(x,y) (memset(x,y,sizeof(x)))
#define fr(i,x,y) for(int i=x;i<=y;i++)
#define lowbit(x) (x&(-x))
using namespace std;
const int maxn=5e4+10;
int n,a[maxn],c[maxn];
void init()
{
cin>>n;
ms(a,0);
fr(i,1,n)
scanf("%d",&a[i]);
fr(i,1,n)
{
c[i]=0;
int l=lowbit(i);
for(int j=i-l+1;j<=i;j++)
{
c[i]+=a[j];
}
}
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int d)
{
//cout<<x<<' '<<d<<endl;
while(x<=n)
{
//cout<<"Add"<<d<<endl;
c[x]+=d;
x+=lowbit(x);
}
}
int query(int x,int y)
{
return sum(y)-sum(x-1);
}
void sub(int x,int d)
{
return add(x,-d);
}
int k=1;
void doit()
{
char op[10];
printf("Case %d:\n",k++);
getchar();
while(scanf("%s",op),strcmp(op,"End"))
{
//cout<<1<<endl;
//fr(i,1,n)cout<<c[i]<<' ';cout<<endl;
if(!strcmp(op,"Query"))
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query(x,y));
}
if(!strcmp(op,"Add"))
{
//cout<<"add";
int x,d;
scanf("%d%d",&x,&d);
add(x,d);
}
if(!strcmp(op,"Sub"))
{
int x,d;
scanf("%d%d",&x,&d);
sub(x,d);
}
//getchar();
}
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
init();

doit();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 线段树