• 模版整理(数据结构)【待更新】


    treap(bzoj3224)

    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstdio>
    #define rep(i,l,r) for (int i=l;i<=r;i++)
    #define down(i,l,r) for (int i=l;i>=r;i--)
    #define clr(x,y) memset(x,y,sizeof(x))
    #define maxn 200500
    using namespace std;
    int n,op,root,ans,x;
    struct T{
    int l[maxn],r[maxn],s[maxn],v[maxn],w[maxn],rnd[maxn];  
    int cnt;
    void up(int t){
        s[t]=s[l[t]]+s[r[t]]+w[t];
    }
    void rt(int &t){
        int k=l[t]; l[t]=r[k]; r[k]=t; up(t); up(k); t=k;
    }
    void lt(int &t){
        int k=r[t]; r[t]=l[k]; l[k]=t; up(t); up(k); t=k;
    }
    void insert(int &t,int x){
        if (t==0){
            t=++cnt; v[t]=x; s[t]=w[t]=1; rnd[t]=rand();
            return;
        }
        s[t]++;
        if (x==v[t]) w[t]++;
        else if (x<v[t]) {
            insert(l[t],x);
            if (rnd[l[t]]<rnd[t]) rt(t); 
        }
        else {
            insert(r[t],x); 
            if (rnd[r[t]]<rnd[t]) lt(t);
        }
    }
    void del(int &t,int x){
        if (t==0) return;
        if (x==v[t]){
            if (w[t]>1) {w[t]--; s[t]--;return;}  //!!!!!!!!!!!!
            if (l[t]*r[t]==0) t=l[t]+r[t];
            else if (rnd[l[t]]<rnd[r[t]]) rt(t),del(t,x);
            else lt(t),del(t,x);
        }
        else if (x<v[t]) s[t]--,del(l[t],x); 
        else s[t]--,del(r[t],x);
    }
    int rank(int t,int x){
        if (t==0) return 0;
        if (x==v[t]) return s[l[t]]+1;
        else if (x<v[t]) return rank(l[t],x);
        else return s[l[t]]+w[t]+rank(r[t],x);
    }
    int select(int t,int k){
        if (t==0) return 0;
        if (k>=s[l[t]]+1&&k<=s[l[t]]+w[t]) return v[t];
        else if (k<s[l[t]]+1) return select(l[t],k);
        else return select(r[t],k-s[l[t]]-w[t]);
    }
    void pred(int t,int x){
        if (t==0) return;
        if (v[t]<x){
            ans=v[t]; pred(r[t],x);
        }
        else pred(l[t],x);
    }
    void succ(int t,int x){
        if (t==0) return ;
        if (v[t]>x){
            ans=v[t]; succ(l[t],x);
        }
        else succ(r[t],x);
    }
    }treap;
    int read(){
        int x=0,f=1; char ch=getchar();
        while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
        while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    int main(){
    //  freopen("in.txt","r",stdin);
        n=read();
        rep(i,1,n){
            op=read();
            if (op==1) {x=read(); treap.insert(root,x);}
            if (op==2) {x=read(); treap.del(root,x);}
            if (op==3) {x=read(); printf("%d
    ",treap.rank(root,x));}
            if (op==4) {x=read(); printf("%d
    ",treap.select(root,x));}
            if (op==5) {x=read(); ans=0; treap.pred(root,x); printf("%d
    ",ans);}
            if (op==6) {x=read(); ans=0; treap.succ(root,x); printf("%d
    ",ans);}
        }
        return 0;
    }
  • 相关阅读:
    IDEA安装scala搭建项目环境
    安装配置Maven和创建Java项目
    IDEA 2019.2的安装破解教程
    GroupBy
    C#快速傅立叶变换(Fast Fourier Transform)
    多种方式收费解决方案
    随机数生成算法
    C#生成随机数的三种方法
    统治世界的十大算法,你都了解多少?
    VR和AR技术是什么意思 二者有什么区别详解
  • 原文地址:https://www.cnblogs.com/ctlchild/p/5027520.html
Copyright © 2020-2023  润新知