zoukankan      html  css  js  c++  java
  • [日常摸鱼]Luogu1801 黑匣子(NOI导刊)

    题意:写一个数据结构,要求滋兹两种操作,ADD:插入一个数,GET:令$i++$然后输出第$i$小的数


    这个数据结构当然是平衡树啦!(雾)

    写个Treap直接过掉啦…

    #include<cstdio>
    #include<cstdlib>
    typedef long long lint;
    const int N=200005;
    inline lint read()
    {
        lint s=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
        return s*f;
    }
    struct Treap
    {
        lint v;
        int l,r,w,rnd,s;
    }tr[N];
    int n,m,cnt;
    int f[N],a[N];
    
    inline void updata(int x)
    {
        tr[x].s=tr[tr[x].l].s+tr[tr[x].r].s+tr[x].w;
    }
    inline void rturn(int &x)
    {
        int t=tr[x].l;tr[x].l=tr[t].r;tr[t].r=x;
        tr[t].s=tr[x].s;updata(x);x=t;
    }
    inline void lturn(int &x)
    {
        int t=tr[x].r;tr[x].r=tr[t].l;tr[t].l=x;
        tr[t].s=tr[x].s;updata(x);x=t;
    }
    inline void insert(int &k,lint val)
    {
        if(k==0)
        {
            k=++cnt;tr[k].v=val;
            tr[k].s=tr[k].w=1;tr[k].rnd=rand();
            return;
        }
        tr[k].s++;
        if(tr[k].v==val)
            tr[k].w++;
        else if(tr[k].v<val)
        {
            insert(tr[k].r,val);
            if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);
        }else
        {
            insert(tr[k].l,val);
            if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);
        }
    }
    inline void query(int k,int val,int &ans)
    {
        if(k==0)return;
        if(val<=tr[tr[k].l].s)
            query(tr[k].l,val,ans);
        else if(tr[tr[k].l].s+tr[k].w<val)
            query(tr[k].r,val-tr[tr[k].l].s-tr[k].w,ans);
        else
            ans=k; 
    }
    int main()
    {
        int x,k=0,rot=0;m=read();n=read();
        for(register int i=1;i<=m;i++)a[i]=read();
        for(register int i=1;i<=n;i++)x=read(),f[x]++;
        for(register int i=1;i<=m;i++)
        {
            insert(rot,a[i]);
            while(f[i]--)
            {
                int ans;query(rot,++k,ans);
                printf("%lld
    ",tr[ans].v);
            }
        }
        return 0;
    }
    View Code

    正解应该是对顶堆…我好像不会做…

  • 相关阅读:
    cocos2dx 3.0 飞机大战
    cocos2dx 3.0 触摸机制
    cocos2d-x 3.0 rc0 + flappybird 学习心得
    cocos2dx 3.0 +VS2012 环境搭建
    cocos2dx 内存管理(3)---CCPoolManager浅析
    cocos2dx 内存管理机制(2)
    Cocos2dx 入门小游戏实例
    myBaits入门
    Java8:函数式编程、Stream
    Java基础巩固
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/8290339.html
Copyright © 2011-2022 走看看