• BZOJ 1503 treap


    思路:
    treap (算是基本操作吧…..)
    加减的操作数很少 就暴力好啦
    每回判断一下最小的数是不是比M小
    如果是 就删,继续判断

    搞定。

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,M,xx,size,root,jy,ans;
    char op[3];
    struct Treap{int ch[2],rnd,cnt,sz,v;}tr[300050];
    void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;}
    void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
    void insert(int &k,int num){
        if(!k){k=++size;tr[k].sz=tr[k].cnt=1,tr[k].v=num,tr[k].rnd=rand();return;}
        tr[k].sz++;
        if(tr[k].v==num){tr[k].cnt++;return;}
        bool f=num>tr[k].v;
        insert(tr[k].ch[f],num);
        if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f);
    }
    void dfs(int k,int num){
        tr[k].v+=num;
        if(tr[k].ch[0])dfs(tr[k].ch[0],num);
        if(tr[k].ch[1])dfs(tr[k].ch[1],num);
    }
    int rank(int k,int num){
        if(tr[tr[k].ch[1]].sz>=num)return rank(tr[k].ch[1],num); 
        else if(tr[tr[k].ch[1]].sz+tr[k].cnt>=num)return tr[k].v;
        else return rank(tr[k].ch[0],num-tr[tr[k].ch[1]].sz-tr[k].cnt);
    }
    int get_min(int k){
        if(tr[k].ch[0])return get_min(tr[k].ch[0]);
        return tr[k].v;
    }
    void del(int &k,int num){
        if(tr[k].v==num){
            if(tr[k].cnt>1)tr[k].cnt--,tr[k].sz--;
            else if(tr[k].ch[0]*tr[k].ch[1]==0)k=max(tr[k].ch[0],tr[k].ch[1]);
            else rot(k,tr[tr[k].ch[0]].rnd>tr[tr[k].ch[1]].rnd),del(k,num);
        }
        else tr[k].sz--,del(tr[k].ch[num>tr[k].v],num);
    }
    int main(){
        scanf("%d%d",&n,&M);
        for(int i=1;i<=n;i++){
            scanf("%s%d",op,&xx);
            if(op[0]=='I'){if(xx>=M)insert(root,xx);}
            else if(op[0]=='S')dfs(root,-xx);
            else if(op[0]=='A')dfs(root,xx);
            else {
                if(xx<=tr[root].sz)printf("%d
    ",rank(root,xx));
                else puts("-1");
            }
            while(tr[root].sz&&(jy=get_min(root))<M)ans++,del(root,jy);
        }
        printf("%d
    ",ans);
    }

    这里写图片描述

  • 相关阅读:
    装饰器(十五)
    静态库与动态库
    深浅拷贝(十四)
    迭代器_iter_,生成器yeild,三元运算,列表解析(十三)
    vim
    文件操作(十二)——open,read,close,write,seek,truncate
    在启用属性的情况下启动 Confluence 6
    Confluence 6 属性的一个示例
    Confluence 6 属性的一个活动
    Confluence 6 使用页面请求属性来对慢性能进行问题解决
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532155.html
Copyright © 2020-2023  润新知