70ptsWA求助(AVY,WAon#9到#12)
查看原帖
70ptsWA求助(AVY,WAon#9到#12)
1074084
asd890123楼主2025/6/25 21:26

都是几万几千行再出错的

#include<bits/stdc++.h>
struct NODE{int val,size,l,r,cnt,h;}tree[100010];
int idx = 0,root = 0;
int getH(int node){return node == 0 ? 0 : tree[node].h;}
void updateH(int node){
    if (node == 0) return;
    tree[node].h = std::max(getH(tree[node].l),getH(tree[node].r)) + 1;
}
int getBalance(int node){
    if (node == 0) return 0;
    return getH(tree[node].l) - getH(tree[node].r);
}
int l_Rotate(int a) {
    int b = tree[a].r;
    int t = tree[b].l;
    tree[b].l = a;tree[a].r = t;
    updateH(a);updateH(b);
    tree[a].size = tree[tree[a].l].size + tree[a].cnt + tree[tree[a].r].size;
    tree[b].size = tree[tree[b].l].size + tree[b].cnt + tree[tree[b].r].size;
    return b;
}
int r_Rotate(int a){
    int b = tree[a].l,c = tree[b].l,d = tree[b].r,e = tree[a].r;
    tree[b].r = a;tree[a].l = d;
    updateH(a);updateH(b);
    tree[a].size = tree[d].size + tree[a].cnt + tree[e].size;
    tree[b].size = tree[c].size + tree[b].cnt + tree[a].size;
    return b;
}
int deleteNode(int root, int val) {
    if (root == 0) return 0;
    if (val < tree[root].val) {
        tree[root].l = deleteNode(tree[root].l, val);
    } else if (val > tree[root].val) {
        tree[root].r = deleteNode(tree[root].r, val);
    } else {
        if (tree[root].cnt > 1) {
            tree[root].cnt--;
            tree[root].size--;
            return root;
        }
        if (tree[root].l == 0 || tree[root].r == 0) {
            int temp = tree[root].l ? tree[root].l : tree[root].r;
            if (temp == 0) return 0;
            else return temp;
        } else {
            int temp = tree[root].r;
            while (tree[temp].l != 0) {
                temp = tree[temp].l;
            }
            tree[root].val = tree[temp].val;
            tree[root].r = deleteNode(tree[root].r, tree[temp].val);
        }
    }
    tree[root].size = tree[tree[root].l].size + tree[root].cnt + tree[tree[root].r].size;
    updateH(root);
    int balance = getBalance(root);
    if (balance > 1 && getBalance(tree[root].l) >= 0) {
        return r_Rotate(root);
    }
    if (balance > 1 && getBalance(tree[root].l) < 0) {
        tree[root].l = l_Rotate(tree[root].l);
        return r_Rotate(root);
    }
    if (balance < -1 && getBalance(tree[root].r) <= 0) {
        return l_Rotate(root);
    }
    if (balance < -1 && getBalance(tree[root].r) > 0) {
        tree[root].r = r_Rotate(tree[root].r);
        return l_Rotate(root);
    }
    return root;
}
int insert(int root,int val){
    if (root == 0){
        tree[++idx] = {val,1,0,0,1};
        return idx;
    }
    if (val < tree[root].val) tree[root].l = insert(tree[root].l,val);
    else if (val == tree[root].val) ++tree[root].cnt;
    else tree[root].r = insert(tree[root].r,val);
    tree[root].size = tree[tree[root].l].size + tree[root].cnt + tree[tree[root].r].size;
    updateH(root);
    int balance = getBalance(root);
    if (balance > 1 && val < tree[tree[root].l].val) return r_Rotate(root);
    if (balance < -1 && val > tree[tree[root].r].val) return l_Rotate(root);
    if (balance > 1 && val > tree[tree[root].l].val){
        tree[root].l = l_Rotate(tree[root].l);
        return r_Rotate(root);
    }
    if (balance < -1 && val < tree[tree[root].r].val){
        tree[root].r = r_Rotate(tree[root].r);
        return l_Rotate(root);
    }
    return root;
}
int rk(int root,int val){
    if (root == 0) return 0;
    int l_size = tree[tree[root].l].size;
    if (val < tree[root].val) return rk(tree[root].l,val);
    else if (val == tree[root].val) return l_size;
    else return rk(tree[root].r,val) + l_size + tree[root].cnt;
}
int kth(int root,int k){
    if (root == 0) return 0;
    int l_size = tree[tree[root].l].size;
    if (k <= l_size) return kth(tree[root].l,k);
    else if (k <= l_size + tree[root].cnt) return tree[root].val;
    else return kth(tree[root].r,k - l_size - tree[root].cnt);
}
int main(){
    std::cin.tie(0)->sync_with_stdio(0);
    int n;std::cin >> n;
    while (n--){
        int op,x;std::cin >> op >> x;
        if (op == 1) root = insert(root,x);
        else if (op == 2) root = deleteNode(root,x);
        else if (op == 3) std::cout << rk(root,x) + 1  << '\n';
        else if (op == 4) std::cout << kth(root,x) << '\n';
        else if (op == 5) std::cout << kth(root,rk(root,x)) << '\n';
        else std::cout << kth(root,rk(root,x + 1) + 1) << '\n';
    }
    return 0;
}
2025/6/25 21:26
加载中...