求调!!
查看原帖
求调!!
985320
TJB_LHY楼主2025/1/23 18:03
#include<bits/stdc++.h>

using namespace std;
struct node {
    int c[2], fa, data, cnt, size;
    void intn(int fa1, int data1) {
        fa = fa1, data = data1;
        cnt = size = 1;
    }
};
struct pinhen_tree {
    node tree[1100005];
    int root, len;
    void Up(int x) {
        tree[x].size = tree[tree[x].c[0]].size + tree[tree[x].c[1]].size + tree[x].cnt;
    }
    void turn(int child) {
        int father = tree[child].fa, grandpa = tree[father].fa;
        bool flag = (tree[father].c[1] == child);

        tree[grandpa].c[tree[grandpa].c[1] == father] = child;
        tree[child].fa = grandpa;
        
        tree[father].c[flag] = tree[child].c[flag ^ 1];
        tree[tree[child].c[flag ^ 1]].fa = father;

        tree[child].c[flag ^ 1] = father;
        tree[father].fa = child;

        Up(father), Up(child);
    }
    void splay(int child, int want) {
        int father,grandpa;
        while (tree[child].fa != want) {
            father = tree[child].fa, grandpa = tree[father].fa;
            if (grandpa != want)((father == tree[grandpa].c[0]) ^ (child == tree[father].c[0])) ? turn(child) : turn(father);
            turn(child);
        }
        if (!want) root = child;
    }
    void find_root_and_change(int u) {
        int v = root;
        while (tree[v].c[u > tree[v].data] && u != tree[v].data) v = tree[v].c[u > tree[v].data];
        splay(v, 0);
    }
    int get_past(int u) {
        find_root_and_change(u);
        int v = root;
        if (tree[v].data < u) return v;
        v = tree[v].c[0];
        while (tree[v].c[1]) v = tree[v].c[1];
        return v;
    }
    int get_then(int u) {
        find_root_and_change(u);
        int v = root;
        if (tree[v].data > u) return v;
        v = tree[v].c[1];
        while (tree[v].c[0]) v = tree[v].c[0];
        return v;
    }
    void del(int u) {
        int past = get_past(u), then = get_then(u);
        splay(past, 0);
        splay(then, past);
        int v = tree[then].c[0];
        if (tree[v].cnt > 1) {
            tree[v].cnt--;
            splay(v, 0);
        } else {
            tree[then].c[0] = 0;
            splay(then, 0);
        }
    }
    int get_rank(int u) {
        find_root_and_change(u);
        return tree[tree[root].c[0]].size;
    }
    int get_vel(int k) {
        int l = root;
        while (1) {
            int r = tree[l].c[0];
            if (tree[r].size + tree[l].cnt < k) {
                k -= tree[r].size + tree[l].cnt;
                l = tree[l].c[1];
            } else if (tree[r].size >= k) l = r;
            else break;
        }
        splay(l, 0);
        return tree[l].data;
    }
    void insert(int v) {
        int x = root, fa1 = 0;
        while (x && tree[x].data != v) {
            x = tree[x].c[v > tree[x].data];
            fa1 = x;
        }
        if (x) tree[x].cnt++;
        else {
            x = ++len;
            tree[fa1].c[v > tree[fa1].data] = x;
            tree[x].intn(fa1, v);
        }
    }
}t;
int n,x,y;
signed main() {
    scanf("%d\n",&n);
    t.insert(-1e9);
    t.insert(1e9);
    while(n--){
        scanf("%d %d\n",&x,&y);
        if(x==1)t.insert(y);
        else if(x==2)t.del(y);
        else if(x==3)printf("%d\n",t.get_rank(y));
        else if(x==4)printf("%d\n",t.get_vel(y+1));
        else if(x==5)printf("%d\n",t.tree[t.get_past(y)].data);
        else printf("%d\n",t.tree[t.get_then(y)].data);
    }
    return 0;
}
2025/1/23 18:03
加载中...