Treap,FHQ Treap都过了,为啥Splay老是TLE?
查看原帖
Treap,FHQ Treap都过了,为啥Splay老是TLE?
464528
见贤思齐_Seakies楼主2023/4/5 18:06

第一个点和最后一个点A了,剩下全T,求调

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 9;
const int inf = 1e9;
struct Splay {
    int son[2], fa, val, sz, cnt;
    void init(int _v, int _fa) {
        val = _v, fa = _fa;
        sz = 1, cnt = 1;
        son[0] = son[1] = 0;
    }
} tr[MAXN];
int root, tot;
void push_up(int o) {
    tr[o].sz = tr[tr[o].son[0]].sz + tr[tr[o].son[1]].sz + tr[o].cnt;
}
void rotate(int x) {
    int y = tr[x].fa, z = tr[y].fa;
    int d = x == tr[y].son[1];
    tr[z].son[y == tr[z].son[1]] = x, tr[x].fa = z;
    tr[y].son[d] = tr[x].son[d ^ 1], tr[tr[x].son[d ^ 1]].fa = y;
    tr[x].son[d ^ 1] = y, tr[y].fa = x;
    push_up(y), push_up(x);
}
void splay(int x, int k) {
    while (tr[x].fa != k) {
        int y = tr[x].fa, z = tr[y].fa;
        if (z != k) (x == tr[y].son[0]) ^ (y == tr[z].son[0]) ? rotate(x) : rotate(y);
        rotate(x);
    }
    if (!k) root = x;
}
void insert(int v) {
    int o = root, fa = 0;
    while (o && v != tr[o].val) {
        fa = o;
        o = tr[o].son[v > tr[o].val];
    }
    if (o) tr[o].cnt++;
    else {
        o = ++tot;
        if (fa) tr[fa].son[v > tr[fa].val] = o;
        tr[o].init(v, fa);
    }
    splay(o, 0);
}
void find(int v) {
    int o = root;
    while (tr[o].val != v && tr[o].son[v > tr[o].val]) o = tr[o].son[v > tr[o].val];
    splay(o, 0);
}
int get_pre(int v) {
    find(v);
    if (tr[root].val <= v) return root;
    int o = tr[root].son[0];
    while (tr[o].son[1]) o = tr[o].son[1];
    return tr[o].val;
}
int get_nxt(int v) {
    find(v);
    if (tr[root].val >= v) return root;
    int o = tr[root].son[1];
    while (tr[o].son[0]) o = tr[o].son[0];
    return tr[o].val;
}
int get_rank(int v) {
	find(v);
	return tr[tr[root].son[0]].sz;
}
void remove(int v) {
    int l = get_pre(v), r = get_nxt(v);
    splay(l, 0); splay(r, l);
    if (tr[tr[r].son[0]].cnt > 1) {
	    tr[tr[r].son[0]].cnt--;
	    splay(tr[r].son[0] , 0);
    } else tr[r].son[0] = 0;
}
int get_key(int k) {
    int o = root;
    while (1) {
        if (tr[o].son[1] && k <= tr[tr[o].son[1]].sz) o = tr[o].son[1];
        else if (k > tr[tr[o].son[1]].sz + tr[o].cnt) {
            k = k - tr[tr[o].son[1]].sz - tr[o].cnt;
            o = tr[o].son[0];
        } else return tr[o].val;
    }
}
int main() {
    int n;
    insert(-inf);
    cin >> n;
    while (n--) {
        int op, x;
        cin >> op >> x;
        if (op == 1) insert(x);
        else if (op == 2) remove(x);
        else if (op == 3) cout << get_rank(x) << endl;
        else if (op == 4) cout << get_key(x) << endl;
        else if (op == 5) cout << get_pre(x) << endl;
        else cout << get_nxt(x) << endl;
    }
    return 0;
}
2023/4/5 18:06
加载中...