线段树-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;
}
#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;
}
相关文章推荐
- hdu 1166 敌兵布阵 线段树
- HDU 1166 敌兵布阵 (线段树单点更新 区间查询)
- HDU 1166 敌兵布阵(线段树版)
- HDU 1166 敌兵布阵(线段树)
- HDU 1166 敌兵布阵【线段树】
- HDU 1166 敌兵布阵(线段树)
- HDU 1166.敌兵布阵【线段树】【树状数组】【4月27】
- HDU 1166 敌兵布阵 线段树
- hdu 1166 敌兵布阵 基础线段树 2种做法
- hdu 1166 敌兵布阵 (线段树单点更新)
- HDU 1166 敌兵布阵【线段树】
- hdu 1166 敌兵布阵 (zkw线段树)
- Hdu 1166 敌兵布阵 -- 线段树
- hdu 1166 敌兵布阵 【线段树】
- hdu 1166 敌兵布阵 线段树 点更新
- 线段树 端点更新 hdu-1166-敌兵布阵
- HDU1166——敌兵布阵(线段树)
- hdu 1166 敌兵布阵(线段树)
- hdu 1166 敌兵布阵(线段树入门题)
- hdu 1166 敌兵布阵(树状数组 or 线段树)