zoukankan      html  css  js  c++  java
  • AC日记——送花 洛谷 P2073

    送花

    思路:

      线段树;

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 100005
    struct TreeNodeType {
        int l,r,ci,sum,num,mid;
    };
    struct TreeNodeType tree[maxn<<2];
    struct OperationType {
        int op,w,c;
    };
    struct OperationType ai[maxn];
    int n,m,bi[maxn],cnt,size;
    bool if_[maxn];
    inline void in(int &now)
    {
        int if_z=1;now=0;
        char Cget=getchar();
        while(Cget>'9'||Cget<'0')
        {
            if(Cget=='-') if_z=-1;
            Cget=getchar();
        }
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
        now*=if_z;
    }
    void build(int now,int l,int r)
    {
        tree[now].l=l,tree[now].r=r;
        if(l==r) return;tree[now].mid=l+r>>1;
        build(now<<1,l,tree[now].mid);
        build(now<<1|1,tree[now].mid+1,r);
    }
    void updata0(int now,int to,int x)
    {
        if(tree[now].l==tree[now].r)
        {
            if_[tree[now].l]=true;
            tree[now].num++;
            tree[now].sum+=x;
            tree[now].ci+=bi[tree[now].l];
            return;
        }
        if(to<=tree[now].mid) updata0(now<<1,to,x);
        else updata0(now<<1|1,to,x);
        tree[now].num=tree[now<<1].num+tree[now<<1|1].num;
        tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
        tree[now].ci=tree[now<<1].ci+tree[now<<1|1].ci;
    }
    void updata1(int now)
    {
        if(tree[now].l==tree[now].r)
        {
            if_[tree[now].l]=false;
            tree[now].num=0;
            tree[now].sum=0;
            tree[now].ci=0;
            return;
        }
        if(tree[now<<1|1].num)updata1(now<<1|1);
        else updata1(now<<1);
        tree[now].num=tree[now<<1].num+tree[now<<1|1].num;
        tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
        tree[now].ci=tree[now<<1].ci+tree[now<<1|1].ci;
    }
    void updata2(int now)
    {
        if(tree[now].l==tree[now].r)
        {
            if_[tree[now].l]=false;
            tree[now].num=0;
            tree[now].sum=0;
            tree[now].ci=0;
            return;
        }
        if(tree[now<<1].num)updata2(now<<1);
        else updata2(now<<1|1);
        tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
        tree[now].num=tree[now<<1].num+tree[now<<1|1].num;
        tree[now].ci=tree[now<<1].ci+tree[now<<1|1].ci;
    }
    int main()
    {
        int now=1;
        in(ai[now].op);
        while(ai[now].op!=-1)
        {
            if(ai[now].op==1)
            {
                in(ai[now].w);
                in(ai[now].c);
                bi[++cnt]=ai[now].c;
            }
            in(ai[++now].op);
        }
        m=now,sort(bi+1,bi+cnt+1);
        size=unique(bi+1,bi+cnt+1)-bi-1;
        build(1,1,size);
        for(int i=1;i<=m;i++)
        {
            if(ai[i].op==1)
            {
                ai[i].c=lower_bound(bi+1,bi+size+1,ai[i].c)-bi;
                if(!if_[ai[i].c]) updata0(1,ai[i].c,ai[i].w);
            }
            if(ai[i].op==2) if(tree[1].num)updata1(1);
            if(ai[i].op==3) if(tree[1].num)updata2(1);
        }
        printf("%d %d
    ",tree[1].sum,tree[1].ci);
        return 0;
    }
  • 相关阅读:
    .NET Remoting 应用实例
    EXT.NET 使用总结(3)--动态图表
    2013,2014
    TreeMap put 操作分析
    C#排序算法小结
    高性能的JavaScript--数据访问(1)
    javascript生成对象的三种方法
    Android开发中经常使用的Content-Type简介
    git diff提示filemode发生改变(old mode 100644、new mode 10075)
    UIWebView的使用
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6941859.html
Copyright © 2011-2022 走看看