Treap求调(玄关)
查看原帖
Treap求调(玄关)
654120
JerryGuoZhe楼主2023/11/20 22:34

rt 代码:

#include<bits/stdc++.h>
using namespace std;
#define rank Rank
const int M=1e5+10;
int cnt=0;
struct node {
    int ls, rs;
    int key, pri;
    int size;
} t[M];

void newnode(int x) {
    ++cnt;
    t[cnt].size=1;
    t[cnt].ls=t[cnt].rs=0;
    t[cnt].key=x, t[cnt].pri=rand();
}

void upd(int u) {
    t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
}

void rotate(int &o, bool d) { // d=1right d=0left
    int k;
    if(!d) {
        k=t[o].rs;
        t[o].rs=t[k].ls;
        t[k].ls=o;
    }
    else {
        k=t[o].ls;
        t[o].ls=t[k].rs;
        t[k].rs=o;
    }
    t[k].size=t[o].size;
    upd(o);
    o=k;
}

void ins(int &u, int x) {
    if(u==0) {newnode(x); u=cnt; return;}
    ++t[u].size;
    if(x<t[u].key) ins(t[u].ls, x);
    else ins(t[u].rs, x);
    if(t[u].ls&&t[t[u].ls].pri>t[u].pri) rotate(u, 1);
    if(t[u].rs&&t[t[u].rs].pri>t[u].pri) rotate(u, 0);
    upd(u);
}

int rank(int u, int x) {
    if(u==0)	return 0;
	if(x>t[u].key) return t[t[u].ls].size+1+Rank(t[u].rs, x);
	return Rank(t[u].ls,x);
}

int th(int u, int x) {
    if(x==t[t[u].ls].size+1) return t[u].key;
    if(x<=t[t[u].ls].size) return th(t[u].ls, x);
    if(x>t[t[u].ls].size+1) return th(t[u].rs, x-t[t[u].ls].size-1);
}

int lowerb(int u, int x) {
    if(u==0) return -2147483648;
    if(x<t[u].key) return lowerb(t[u].ls, x);
    int tmp=lowerb(t[u].rs, x);
    if(tmp!=-2147483648) return tmp;
    return t[u].key;
}
int upperb(int u, int x) {
    if(u==0) return -2147483648;
    if(x>t[u].key) return upperb(t[u].rs, x);
    int tmp=upperb(t[u].ls, x);
    if(tmp!=-2147483648) return tmp;
    return t[u].key;
}

void del(int &u, int x) {
    --t[u].size;
    if(t[u].key==x) {
        if(!(t[u].ls||t[u].rs)) u=0;
        else if(t[u].ls^t[u].rs) u=t[u].ls+t[u].rs;
        else
            if(t[t[u].ls].pri>t[t[u].rs].pri) {
                rotate(u, 0);
                del(t[u].ls, x);
            }
            else {
                rotate(u, 1);
                del(t[u].rs, x);
            }
        return;
    }
    if(t[u].key>x) del(t[u].ls, x);
    else del(t[u].rs, x);
    upd(u);
}

void sor(int u) {
    if(u==0) return;
    sor(t[u].ls);
    cout << t[u].key << " "; //  << t[u].size << endl;
    sor(t[u].rs);
}

int main() {
    int n, root=0;
    cin >> n;
    for(int i=0; i<n; i++) {
        int opt, x;
        cin >> opt;
        switch(opt) {
            case 1: cin >> x; ins(root, x); break;
            case 2: cin >> x; del(root, x); break;
            case 3: cin >> x; cout << rank(root, x)+1 << endl; break;
            case 4: cin >> x; cout << th(root, x) << endl; break;
            case 5: cin >> x; cout << lowerb(root, x) << endl; break;
            case 6: cin >> x; cout << upperb(root, x) << endl; break;
            case 10: sor(root); cout << endl; break;
        }
    }
    return 0;
}
2023/11/20 22:34
加载中...