Splay 30pts 求调
查看原帖
Splay 30pts 求调
545601
Mr_Biantainne楼主2024/12/18 19:28

只过 #1 #3 #8,其余 WA

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, minn, x, rt, idex, tot, lft, cnt;
char op;
struct st
{
	ll fa, son[2], v, cnt, sz;
	void init(ll f, ll vv)
	{
		fa = f, v = vv;
		cnt = sz = 1;
	}
}tr[300005];
void pushup(ll x)
{
	tr[x].sz = tr[tr[x].son[0]].sz + tr[tr[x].son[1]].sz + tr[x].cnt;
}
void rotate(ll x)
{
	ll y = tr[x].fa, z = tr[y].fa;
	if (tr[y].son[0] == x) // right-shift
	{
		tr[y].son[0] = tr[x].son[1];
		tr[tr[x].son[1]].fa = y;
		tr[x].son[1] = y;
		tr[y].fa = x;
		tr[z].son[tr[z].son[1] == y] = x;
		tr[x].fa = z;
	}
	else //left-shift
	{
		tr[y].son[1] = tr[x].son[0];
		tr[tr[x].son[0]].fa = y;
		tr[x].son[0] = y;
		tr[y].fa = x;
		tr[z].son[tr[z].son[1] == y] = x;
		tr[x].fa = z;
	}
	pushup(y), pushup(x);
}
void splay(ll x, ll k)
{
	while (tr[x].fa != k)
	{
		ll y = tr[x].fa, z = tr[y].fa;
		if (k != z)
		{
			if ((tr[y].son[0] == x) + (tr[z].son[0] == y) == 1) rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	if (k == 0) rt = x;
}
void find(ll v)
{
	ll now = rt;
	while (tr[now].son[v > tr[now].v] && tr[now].v != v) now = tr[now].son[v > tr[now].v];
	splay(now, 0);
}
ll get_pre(ll v)
{
	find(v);
	if (tr[rt].v < v) return rt;
	ll now = tr[rt].son[0];
	while (tr[now].son[1]) now = tr[now].son[1];
	splay(now, 0);
	return now;
}
ll get_nxt(ll v)
{
	find(v);
	if (tr[rt].v > v) return rt;
	ll now = tr[rt].son[1];
	while (tr[now].son[0]) now = tr[now].son[0];
	splay(now, 0);
	return now;
}
void ins(ll v)
{
	ll now = rt, p = 0;
	while (now && tr[now].v != v)
	{
		p = now;
		now = tr[now].son[v > tr[now].v];
	}
	if (now) tr[now].cnt++;
	else
	{
		now = ++idex;
		tr[p].son[v > tr[p].v] = now;
		tr[now].init(p, v);
	}
	splay(now, 0);
}
void del(ll v)
{
	ll pre = get_pre(v), nxt = get_nxt(v);
	splay(pre, 0), splay(nxt, pre);
	ll now = tr[nxt].son[0];
	if (tr[now].sz == 1) tr[nxt].son[0] = 0, splay(nxt, 0);
	else tr[now].cnt--, splay(now, 0);
}
ll get_val(ll k)
{
	ll now = rt;
	while (1)
	{
		ll nxt = tr[now].son[0];
		if (tr[nxt].sz + tr[now].cnt < k)
		{
			k -= tr[nxt].sz + tr[now].cnt;
			now = tr[now].son[1];
		}
		else if (tr[nxt].sz >= k) now = nxt;
		else break;
	}
	splay(now, 0);
	return tr[now].v;
}
int main()
{
    ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> minn;
	ins(-1e18), ins(1e18);
	while (n--)
	{
		cin >> op >> x;
		if (op == 'I')
        {
            if (x - tot >= minn) ins(x - tot), lft++;
        }
        else if (op == 'A') minn -= x, tot += x;
        else if (op == 'S')
        {
            minn += x, tot -= x;
            ll p = tr[get_pre(minn - 1)].v;
            while (p != -1e18)
            {
                del(p);
                cnt++;
                lft--;
                p = tr[get_pre(minn - 1)].v;
            }
        }
        else
        {
            if (x > lft) cout << -1 << endl;
            else cout << get_val(lft - x + 2) + tot << endl;
        }
	}
    cout << cnt;
}
2024/12/18 19:28
加载中...