求问P5076 【深基16.例7】普通二叉树(简化版)
  • 板块学术版
  • 楼主CNS_5t0_0r2
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/6/29 15:09
  • 上次更新2023/11/3 12:09:29
查看原帖
求问P5076 【深基16.例7】普通二叉树(简化版)
999274
CNS_5t0_0r2楼主2023/6/29 15:09

样例过了,但是全部 MLE 求助

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 9;
int q,op,x,cnt,root = 1;
struct node{
    int l,r,num_val,tree_size,num_cnt;
    node(int _num_val_){
        l = 0;
        r = 0;
        num_val = _num_val_;
        tree_size = 1;
        num_cnt = 1;
    }
    node(){}
} a[N];
void update(int root){
    a[root].tree_size = a[a[root].l].tree_size + a[a[root].r].tree_size + a[root].num_cnt;
}
int x_rank(int x,int root){
    if(root){
        if(x < a[root].num_val)
            return x_rank(x,a[root].l);
        else if(x > a[root].num_val)
            return x_rank(x,a[root].r) + a[a[root].l].tree_size + a[root].num_cnt;
        return a[a[root].l].tree_size + a[root].num_cnt;
    }
    return 1;
}
int xth_num(int x,int root){
    if(x <= a[a[root].l].num_cnt)
        return xth_num(x,a[root].l);
    else if(x <= a[a[root].l].num_cnt + a[root].num_cnt)
        return a[root].num_val;
    return xth_num(x - (a[a[root].l].num_cnt + a[root].num_cnt),a[root].r);
}
void insert(int x,int root){
    if(x < a[root].num_val){
        if(!a[root].l){
            cnt++;
            a[root].l = cnt;
            a[cnt] = node(x);
        }
        else
            insert(x,a[root].l);
    }
    else if(x > a[root].num_val){
        if(!a[root].r){
            cnt++;
            a[root].r = cnt;
            a[cnt] = node(x);
        }
        else
            insert(x,a[root].r);
    }
    else{
        a[root].num_cnt++;
    }
    update(root);
}
int main(){
    scanf("%d", &q);
    cnt++;
    for(int i = 1;i <= q;i++){
        scanf("%d%d", &op, &x);
        if(op == 1)
            printf("%d\n", x_rank(x,root));
        if(op == 2)
            printf("%d\n", xth_num(x,root));
        if(op == 3){
            int tmp = x_rank(x,root);
            if(tmp == 1)
                printf("-2147483647\n");
            else
                printf("%d\n", xth_num(tmp - 1,root));
        }
        if(op == 4){
            int tmp = x_rank(x,root);
            if(tmp == a[root].tree_size)
                printf("2147483647\n");
            else
                printf("%d\n", xth_num(tmp + 1,root));
        }
        if(op == 5)
            insert(x,root);
    }
}
2023/6/29 15:09
加载中...