导航

HDU 1166

Posted on 2015-05-23 12:48  tun~  阅读(199)  评论(0编辑  收藏  举报

(中文题意)

线段树水题。我写的第一个线段树。

re是因为数组开小了。线段树的数组下次开3*n,而不是2*n。

#include<iostream>
#include<stdio.h>
using namespace std;
int n,tar,val,ans;
bool ok;
struct tr
{
    int l,r,num;
};
int tmp[50005];
tr me[100010+50005];
void build(int s,int e,int k)
{
    int m;
    me[k].l=s;
    me[k].r=e;
    if(s==e)
    {
        me[k].num=tmp[s];
        return;
    }
    m=(s+e)>>1;
    build(s,m,k<<1);
    build(m+1,e,k<<1|1);
    me[k].num=me[k<<1].num+me[k<<1|1].num;
}
void solve(int k)
{
    int m;
    if(ok)
    {
        me[k].num+=val;
    }
    else
    {
        me[k].num-=val;
    }
    if(me[k].r==me[k].l)
        return;
    m=(me[k].r+me[k].l)>>1;
    if(tar>m)
    {
        solve(k<<1|1);
    }
    else
    {
        solve(k<<1);
    }
}
void add()
{
    scanf("%d%d",&tar,&val);
    ok=1;
    solve(1);
}
void sub()
{
    scanf("%d%d",&tar,&val);
    ok=0;
    solve(1);
}
void que(int k,int x,int y)
{
    int m;
    if(me[k].l==x&&me[k].r==y)
    {
        ans+=me[k].num;
        return;
    }
    m=(me[k].l+me[k].r)>>1;
    if(x<=m&&y>m)
    {
        que(k<<1,x,m);
        que(k<<1|1,m+1,y);
    }
    else if(y<=m)
    {
        que(k<<1,x,y);
    }
    else if(x>m)
    {
        que(k<<1|1,x,y);
    }
}
int main()
{
    int t,i,j,k,m,x,y,z;
    char typ[15];
    while(scanf("%d",&t)!=EOF)
    {
        getchar();
        for(i=1;i<=t;i++)
        {
            printf("Case %d:\n",i);
            scanf("%d",&n);
            getchar();
            for(j=1;j<=n;j++)
            {
                scanf("%d",&tmp[j]);
            }
            getchar();
            build(1,n,1);
            scanf("%s",typ);
            while(typ[0]!='E')
            {
                switch(typ[0])
                {
                case 'A':
                    add();break;
                case 'S':
                    sub();break;
                case 'Q':
                    scanf("%d%d",&x,&y);
                    ans=0;
                    que(1,x,y);
                    printf("%d\n",ans);break;
                }
                getchar();
                scanf("%s",&typ);
            }
        }
    }
    return 0;
}