20pts,WA,求调
查看原帖
20pts,WA,求调
464528
见贤思齐_Seakies楼主2023/4/8 15:29
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1000000;
class FHQ_Treap {
    private:
    struct fhq_treap {
        int l, r, key, val;
    } tr[200005];
    int root, tot, x, y, z;
    int get_new(int v) {
        tr[++tot].key = v;
        tr[tot].val = rand();
        return tot;
    }
    void split(int o, int v, int &x, int &y) {
        if (!o) x = y = 0;
        else {
            if (tr[o].key <= v) x = o, split(tr[o].r, v, tr[o].r, y);
            else y = o, split(tr[o].l, v, x, tr[o].l);
        }
    }
    int merge(int x, int y) {
        if (!x || !y) return x + y;
        if (tr[x].val > tr[y].val) {
            tr[x].r = merge(tr[x].r, y);
            return x;
        } else {
            tr[y].l = merge(x, tr[y].l);
            return y;
        }
    }
    void insert(int v) {
        split(root, v, x, y);
        root = merge(merge(x, get_new(v)), y);
    }
    void remove(int v) {
        split(root, v, x, z);
        split(x, v - 1, x, y);
        y = merge(tr[y].l, tr[y].r);
        root = merge(merge(x, y), z);
    }
    int get_pre(int v) {
        split(root, v - 1, x, y);
        int o = x;
        while (tr[o].r) o = tr[o].r;
        int ans = tr[o].key;
        root = merge(x, y);
        return ans;
    }
    int get_nxt(int v) {
        split(root, v, x, y);
        int o = y;
        while (tr[o].l) o = tr[o].l;
        int ans = tr[o].key;
        root = merge(x, y);
        return ans;
    }
    public:
    bool empty() {
        // cout << root << endl;
        return root == 0;
    }
    void ins(int v) {
        insert(v);
    }
    void del(int v) {
        remove(v);
    }
    int pre(int v) {
        return get_pre(v);
    }
    int nxt(int v) {
        return get_nxt(v);
    }
} fhq[2];
int n, ans;
signed main() {
    cin >> n;
    while (n--) {
        int op, x;
        cin >> op >> x;
        // if (fhq[op ^ 1].empty()) fhq[op].ins(x);
        // else {
            int a = fhq[op ^ 1].pre(x), b = fhq[op ^ 1].nxt(x);
            // cout << x << ' ' << a << ' ' << b << endl;
            if (a == 0 && b == 0) fhq[op].ins(x);
            else if (a != 0 && x - a <= b - x) {
                (ans += x - a) %= mod;
                fhq[op ^ 1].del(a);
            } else if (b != 0) {
                (ans += b - x) %= mod;
                fhq[op ^ 1].del(b);
            }
        // }
    }
    cout << ans % mod << endl;
    return 0;
}```
2023/4/8 15:29
加载中...