FHQ Treap求调
查看原帖
FHQ Treap求调
947380
jiangxinyang2012楼主2024/3/24 18:43
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1000000;
const int N = 200005;
const int INF = 0x3f3f3f3f;
mt19937 sj(114514);
struct FHQ {
    int ls, rs, key, sz, val;
} fhq[N];
int root, T1, T2, T3, ck;
int xj(int v) {
    fhq[++ck] = {0, 0, (int)sj(), 1, v};
    return ck;
}
void push_up(int u) {
    fhq[u].sz = fhq[fhq[u].ls].sz + fhq[fhq[u].rs].sz + 1;
}
void split(int u, int v, int& x, int& y) {
    if (!u) {
        x = y = 0;
        return;
    }
    if (fhq[u].val > v) {
        y = u;
        split(fhq[u].ls, v, x, fhq[u].ls);
    } else {
        x = u;
        split(fhq[u].rs, v, fhq[u].rs, y);
    }
    push_up(u);
}
int merge(int x, int y) {
    if (!x || !y) {
        return x + y;
    }
    if (fhq[x].key > fhq[y].key) {
        fhq[x].rs = merge(fhq[x].rs, y);
        push_up(x);
        return x;
    } else {
        fhq[y].ls = merge(x, fhq[y].ls);
        push_up(y);
        return y;
    }
}
void insert(int v) {
    split(root, v, T1, T2);
    root = merge(merge(T1, xj(v)), T2);
}
void erase(int x) {
    split(root, x, T1, T2);
    split(T1, x - 1, T1, T3);
    T3 = merge(fhq[T3].ls, fhq[T3].rs);
    root = merge(merge(T1, T3), T2);
}
int find_rank(int x) {
    split(root, x - 1, T1, T2);
    int res = fhq[T1].sz + 1;
    root = merge(T1, T2);
    return res;
}
int kth(int k) {
    int u = root;
    while (u) {
        int tmp = fhq[fhq[u].ls].sz + 1;
        if (tmp == k) {
            break;
        } else if (k < tmp) {
            u = fhq[u].ls;
        } else {
            k -= tmp;
            u = fhq[u].rs;
        }
    }
    return fhq[u].val;
}
int find_pre(int u, int v) {
    if (u == 0)
        return -INF;
    if (fhq[u].val < v) {
        int res = find_pre(fhq[u].rs, v);
        return res == -INF ? fhq[u].val : res;
    } else {
        return find_pre(fhq[u].ls, v);
    }
}
int find_next(int u, int v) {
    if (u == 0)
        return INF;
    if (fhq[u].val > v) {
        int res = find_next(fhq[u].ls, v);
        return res == INF ? fhq[u].val : res;
    } else {
        return find_next(fhq[u].rs, v);
    }
}
int main() {
    int _;
    scanf("%d", &_);
    int ans = 0;
    while (_--) {
        int o, x;
        scanf("%d%d", &o, &x);
        if (o == 0) {
            insert(x);
        } else {
            int pre = find_pre(root, x + 1), next = find_next(root, x - 1);
            if (pre == -INF && next == INF) {
                continue;
            }
            if (pre == -INF) {
                ans += next - x;
                erase(next);
            } else if (next == INF) {
                ans += x - pre;
                erase(pre);
            } else {
                if (x - pre <= next - x) {
                    ans += x - pre;
                    erase(pre);
                } else {
                    ans += next - x;
                    erase(next);
                }
            }
            ans %= mod;
        }
    }
    printf("%d\n", ans);
    return 0;
}

2024/3/24 18:43
加载中...