代码整体思路经测试肯定没有问题,就是遇到大数据有的时候MLE不输出,求调!
查看原帖
代码整体思路经测试肯定没有问题,就是遇到大数据有的时候MLE不输出,求调!
378582
Jack_1218楼主2024/10/19 18:20

RT,subtask 0全MLE,大数据的时候不输出

应该是一个奇怪的问题

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int q;
struct BST {
    int lc, rc;
    int val, cnt;
    int sum; 
    //cnt表示val的出现次数
    //sum表示子树中cnt的和
    BST() {
        lc = rc = val = cnt = sum = 0;
    }
} T[N];

int root = -1;
int tt = 0;

void pushup(int rt) {
    T[rt].sum = T[rt].cnt + T[T[rt].lc].sum + T[T[rt].rc].sum;
}

void add(int rt, int x) {
    if (x == T[rt].val) {
        T[rt].cnt++;
        T[rt].sum++;
    } else if (x < T[rt].val) {
        if (T[rt].lc == 0) {
            T[rt].lc = ++tt;
            T[tt].val = x;
            T[tt].cnt = T[tt].sum = 1;
        } else {
            add(T[rt].lc, x);
        }
    } else {
        if (T[rt].rc == 0) {
            T[rt].rc = ++tt;
            T[tt].val = x;
            T[tt].cnt = T[tt].sum = 1;
        } else {
            add(T[rt].rc, x);
        }
    }
    pushup(rt);
}

int rk(int rt, int x) {
    if (rt == 0) return 1;
    //查询数x的排名
    if (T[rt].val == x) {
        return T[T[rt].lc].sum + 1;
    }
    if (T[rt].val > x) {
        //left
        return rk(T[rt].lc, x);
    }
    return rk(T[rt].rc, x) + T[T[rt].lc].sum + T[rt].cnt;
}

int num(int rt, int x) {
    //cerr<<"rt:"<<rt<<endl;
    if (x <= T[T[rt].lc].sum) {
        return num(T[rt].lc, x);
    }
    if (x > T[T[rt].lc].sum && x <= T[T[rt].lc].sum + T[rt].cnt) {
        return T[rt].val;
    }
    return num(T[rt].rc, x - (T[T[rt].lc].sum + T[rt].cnt));
}

int tmp;

int pre(int rt, int x) {
    if (x <= T[rt].val) {
        if (T[rt].lc == 0) return -2147483647;
        return pre(T[rt].lc, x);
    }
    tmp = pre(T[rt].rc, x);
    if (tmp == -2147483647) return T[rt].val;
    return tmp;
}

int nxt(int rt, int x) {
    if (T[rt].val <= x) {
        if (T[rt].rc == 0) return 2147483647;
        else return nxt(T[rt].rc, x);
    }
    tmp = nxt(T[rt].lc, x);
    if (tmp == 2147483647) return T[rt].val;
    return tmp;
}

int main() {
    freopen("a.in", "r", stdin);
    freopen("a.out", "w", stdout);
    //cout << sizeof(long long) << endl;
    //cout<<1;
    scanf("%d", &q);
    int op, x;
    //cout<<1;
    while (q--) {
        scanf("%d%d", &op, &x);
        //cout<<21;
        if (op == 1) {
            printf("%d\n", rk(root, x));
        } else if (op == 2) {
            printf("%d\n", num(root, x));
        } else if (op == 3) {
            printf("%d\n", pre(root, x));
        } else if (op == 4) {
            printf("%d\n", nxt(root, x));
        } else {
            //cout << "in\n";
            if (root == -1) {
                root = ++tt;
                T[root].sum = T[root].cnt = 1;
                T[root].val = x;
            } else {
                //cout<<"1\n";
                add(root, x);
                //cout<<"1\n";
            }
        }
    }
    return 0;
}
2024/10/19 18:20
加载中...