zoukankan      html  css  js  c++  java
  • HDU 1166

    (中文题意)

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

    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:
    ",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
    ",ans);break;
                    }
                    getchar();
                    scanf("%s",&typ);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    AD9 如何画4层pcb板
    在Altium Designer 2009下如何添加Logo图
    [置顶] 整数拆分 整合算法
    altium designer 中的top/bottom solder和top/bottom paste mask
    vs2012 与 win7 不兼容的问题
    poj1742 Coins
    poj3181 Dollar Dayz
    poj1065 Wooden Sticks
    poj1631 Bridging signals
    poj3666 Making the Grade
  • 原文地址:https://www.cnblogs.com/tun117/p/4523979.html
Copyright © 2011-2022 走看看