线段树-HDU 1166 敌兵布阵

来源:互联网 发布:ubuntu vim设置 编辑:程序博客网 时间:2024/06/05 07:40

一道线段树的基础入门题,这题得到一个教训····  字符串千万别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;}


0 0
原创粉丝点击