最后一个测试点 TLE
查看原帖
最后一个测试点 TLE
1333328
Co_Ce楼主2025/1/24 21:12
#include <bits/stdc++.h>

// using std::cin;
// using std::cout;
namespace FastIO {

template<class T> inline void read(T &x) {
	x = 0; bool f = 0; int ch = getchar();
	for (; !isdigit(ch); f = (ch == '-'), ch = getchar()) ;
	for (; isdigit(ch); x = x * 10 + ch - '0', ch = getchar()) ;
	x = f ? -x : x;
}

inline int read() {
	int x = 0; bool f = 0; int ch = getchar();
	for (; !isdigit(ch); f = (ch == '-'), ch = getchar()) ;
	for (; isdigit(ch); x = x * 10 + ch - 48, ch = getchar()) ;
	return f ? -x : x;
}

int NUM[65];
template<class T> inline void Write(T x) {
	if (x == 0) { putchar('0'); return ;}
	if (x < 0) putchar('-');
	x = x > 0 ? x : -x;
	int tot = 0;
	while (x) NUM[tot++] = x % 10 + 48, x /= 10;
	while (tot) putchar(NUM[--tot]);
}

template<class T> inline void write(T x, char op) {
    printf("%d\n", x);
}

}

using namespace FastIO;

const int MAX_N = 1e5;

int n;

int tot = 1;
int rt = 1, ch[MAX_N + 9][2], val[MAX_N + 9], sz[MAX_N + 9], cnt[MAX_N + 9];

void insert(int x) {
    int u = rt, lst = 0;
    for (; u && val[u] != x; lst = u, u = ch[u][x > val[u]]) sz[u]++;
    if (val[u] == x) cnt[u]++, sz[u]++;
    else {
        if (lst) u = ch[lst][x > val[lst]] = ++tot;
        val[u] = x;
        cnt[u] = sz[u] = 1;
    }
}

int rank(int x) {
    int u = rt, res = 0;
    for (; u && val[u] != x; u = ch[u][x > val[u]])
        if (x > val[u]) res += sz[ch[u][0]] + cnt[u];
    if (val[u] == x) res += sz[ch[u][0]];
    return res + 1;
}

int kth(int k) {
    int u = rt;
    while (1) {
        if (k <= sz[ch[u][0]]) u = ch[u][0];
        else if (k <= sz[ch[u][0]] + cnt[u]) return val[u];
        else k -= sz[ch[u][0]] + cnt[u], u = ch[u][1];
    }
}

int pre(int x) {
    return kth(rank(x) - 1);
}

int suc(int x) {
    return kth(rank(x + 1));
}

void del(int x) {
    int u = rt, lst = 0;
    for (; val[u] != x; lst = u, u = ch[u][x > val[u]]) sz[u]--;
    cnt[u]--, sz[u]--;
}

int main() {
    read(n);
    while (n--) {
        int op = read(), x = read();
        switch (op) {
            case 1 : insert(x); break;
            case 2 : del(x); break;
            case 3 : write(rank(x), '\n'); break;
            case 4 : write(kth(x), '\n'); break;
            case 5 : write(pre(x), '\n'); break;
            case 6 : write(suc(x), '\n'); break;
            default : break;
        }
    }
    return 0;
}
2025/1/24 21:12
加载中...