fhq-treap20pts求条
查看原帖
fhq-treap20pts求条
695685
AssiduousCoding楼主2025/2/6 15:53

rt

#include <bits/stdc++.h>

using namespace std;
const int N = 2000010, MOD = 1000000;

int n;
int root1, idx1, root2, idx2;
struct Node
{
    int l, r;
    int key, val;
    int size;
} person[N], pet[N];
int x, y, z;

int get_node(Node tr[], int key, int& idx)
{
    tr[ ++ idx] = {0, 0, key, rand(), 1};
    return idx;
}

void pushup(Node tr[], int u)
{
    tr[u].size = tr[tr[u].l].size + tr[tr[u].r].size + 1;
}

void split(Node tr[], int p, int key, int& left, int& right)
{
    if (!p) left = right = 0;
    else
    {
        if (tr[p].key <= key)
        {
            left = p;
            split(tr, tr[p].r, key, tr[p].r, right);
        }
        else
        {
            right = p;
            split(tr, tr[p].l, key, left, tr[p].l);
        }
        pushup(tr, p);
    }
}

int merge(Node tr[], int left, int right)
{
    if (!left || !right) return left | right;
    if (tr[left].val >= tr[right].val)
    {
        tr[left].r = merge(tr, tr[left].r, right);
        pushup(tr, left);
        return left;
    }
    else
    {
        tr[right].l = merge(tr, left, tr[right].l);
        pushup(tr, right);
        return right;
    }
}

void insert(Node tr[], int key, int& root, int& idx)
{
    split(tr, root, key, x, y);
    root = merge(tr, merge(tr, x, get_node(tr, key, idx)), y);
}

void remove(Node tr[], int key, int& root)
{
    split(tr, root, key, x, z), split(tr, x, key - 1, x, y);
    y = merge(tr, tr[y].l, tr[y].r);
    root = merge(tr, merge(tr, x, y), z);
}

int get_key(Node tr[], int p, int rank)
{
    if (!p) return -1;
    int k = tr[tr[p].l].size + 1;
    if (rank == k) return tr[p].key;
    if (rank < k) return get_key(tr, tr[p].l, rank);
    return get_key(tr, tr[p].r, rank - k);
}

int get_prev(Node tr[], int key, int& root)
{
    split(tr, root, key, x, y);
    int res = get_key(tr, x, tr[x].size);
    root = merge(tr, x, y);
    return res;
}

int get_next(Node tr[], int key, int& root)
{
    split(tr, root, key - 1, x, y);
    int res = get_key(tr, y, 1);
    root = merge(tr, x, y);
    return res;
}

int main() 
{
    srand(time(nullptr));

    cin >> n;

    long long ans = 0LL;
    while (n -- )
    {
        int type, v; cin >> type >> v;
        if (type)
        {
            insert(person, v, root2, idx2);
            int a = get_prev(pet, v, root1), b = get_next(pet, v, root1);
            // cout << a << ' ' << b << ' ' << v << endl;
            if (a > 0 && v - a <= b - v)
            {
                ans = (long long)(ans + v - a) % MOD;
                remove(pet, a, root1), remove(person, v, root2);
            }
            else if (b > 0)
            {
                ans = (long long)(ans + b - v) % MOD;
                remove(pet, b, root1), remove(person, v, root2);
            }
        }
        else
        {
            insert(pet, v, root1, idx1);
            int a = get_prev(person, v, root2), b = get_next(person, v, root2);
            // cout << a << ' ' << b << ' ' << v << endl;
            if (a > 0 && v - a <= b - v)
            {
                ans = (long long)(ans + v - a) % MOD;
                remove(person, a, root2), remove(pet, v, root1);
            }
            else if (b > 0)
            {
                ans = (long long)(ans + b - v) % MOD;
                remove(person, b, root2), remove(pet, v, root1);
            }
        }
    }

    cout << ans << endl;

    return 0;
}
2025/2/6 15:53
加载中...