码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1166

时间:2015-05-23 14:06:39      阅读:102      评论:0      收藏: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;
}

 

HDU 1166

标签:

原文地址:http://www.cnblogs.com/tun117/p/4523979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!