90 pts WA on #6 FHQ-Treap 求调
查看原帖
90 pts WA on #6 FHQ-Treap 求调
464602
Day_Tao楼主2024/5/6 12:34

RT

#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define mp(x, y) make_pair(x, y)
#define pqg priority_queue<int, vector<int>, greater<int>>
#define pql priority_queue<int, vector<int>, less<int>>
#define ls(x) tree[x].lson
#define rs(x) tree[x].rson
#define scnaf scanf
#define int long long
const int MAX = 2e5 + 5;
const int INF = 0x7fffffff;
const int mod = 998244353;
mt19937 rnd(233);
int siz, rt, x, y, z, n, s, m, minn, sum, ans;
char op;
struct Day_Tao
{
    int lson, rson;
    int val, key, sz;
} tree[MAX];
inline void push_up(int root)
{
    tree[root].sz = tree[ls(root)].sz + tree[rs(root)].sz + 1;
}
inline void split(int root, int val, int &x, int &y)
{
    if (!root)
    {
        x = y = 0;
        return;
    }
    if (tree[root].val <= val)
        x = root, split(rs(root), val, rs(root), y);
    else
        y = root, split(ls(root), val, x, ls(root));
    push_up(root);
}
inline int merge(int x, int y)
{
    if (x == 0 || y == 0)
        return x + y;
    if (tree[x].key < tree[y].key)
    {
        rs(x) = merge(rs(x), y), push_up(x);
        return x;
    }
    else
    {
        ls(y) = merge(x, ls(y)), push_up(y);
        return y;
    }
}
inline int add(int val)
{
    tree[++siz].val = val;
    tree[siz].key = rnd();
    tree[siz].sz = 1;
    return siz;
}
inline void insert(int val)
{
    split(rt, val, x, y);
    rt = merge(merge(x, add(val)), y);
}
inline void del(int val)
{
    split(rt, val, x, y), split(x, val - 1, x, z);
    rt = merge(merge(x, merge(ls(z), rs(z))), y);
}
inline int find_by_order(int rk)
{
    int root = rt;
    while (root)
    {
        if (tree[ls(root)].sz + 1 == rk)
            break;
        else if (tree[ls(root)].sz >= rk)
            root = ls(root);
        else
            rk -= tree[ls(root)].sz + 1, root = rs(root);
    }
    return tree[root].val;
}
inline int get_pre(int val)
{
    split(rt, val - 1, x, y);
    int root = x, res;
    while (rs(root))
        root = rs(root);
    res = tree[root].val,
    rt = merge(x, y);
    return res;
}
signed main()
{
    int p = 0;
    scanf("%lld%lld", &n, &minn);
    while (n--)
    {
        cin >> op >> s;
        if (op == 'I')
        {
            s += p;
            if (s < minn)
                continue;
            insert(s);
            sum++;
        }
        else if (op == 'A')
        {
            p -= s, minn -= s;
        }
        else if (op == 'S')
        {
            p += s, minn += s;
            while (get_pre(minn))
                del(get_pre(minn)), sum--, ans++;
        }
        else if (op == 'F')
        {
            if (s > sum)
                puts("-1");
            else
                printf("%lld\n", find_by_order(sum - s + 1) - p);
        }
    }
    printf("%lld\n", ans);
    system("pause");
    return 0;
}
2024/5/6 12:34
加载中...