求调
查看原帖
求调
1401095
zhangchengqi666楼主2025/1/23 10:17

全TLE求调

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 300000 + 5;

struct tree {
	int l, r, val, pty, sz;
} node[N * 4];

int n, mn, dl, dr, root, num, s, cnt;

void pushup(int x) {
	node[x].sz = node[node[x].l].sz + node[node[x].r].sz + 1;
}

void split(int u, int & l, int & r, int val) {
	if (!u) {
		l = r = 0;
		return;
	}
	if (node[u].val <= val) {
		l = u;
		split(node[u].r, node[u].r, r, val);
	} else {
		r = u;
		split(node[u].l, l, node[u].l, val);
	}
	pushup(u);
}

int merge(int l, int r) {
	if (!l || !r) {
		return l + r;
	}
	if (node[l].pty <= node[r].pty) {
		node[l].r = merge(node[l].r, r);
		pushup(l);
		return l;
	} else  {
		node[r].l = merge(l, node[r].l);
		pushup(r);
		return r;
	}
}

void add(int val) {
	num++;
	node[num].val = val;
	node[num].pty = rand();
	node[num].sz = 1;
}

void ins(int val) {
	split(root, dl, dr, val);
	add(val);
	root = merge(merge(dl, num), dr);
}

int kth(int u, int p) {
	if (p == node[node[u].l].sz + 1) {
		return node[u].val;
	} else if (p < node[node[u].l].sz + 1) {
		p -= node[node[u].l].sz + 1;
		return kth(node[u].r, p);
	} else {
		return kth(node[u].l, p);
	}
}

int rnk(int val) {
	split(root, dl, dr, val - 1);
	root = dr;
	return node[dl].sz;
}

signed main(void) {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	srand(time(NULL));
	cin >> n >> mn;
	for (int i = 1; i <= n; i++) {
		char opt;
		int x;
		cin >> opt >> x;
		if (opt == 'I') {
			if (x < mn) continue;
			ins(x - s);
		} else if (opt == 'A') {
			s += x;
		} else if (opt == 'S') {
			s -= x;
			cnt += rnk(mn - s);
		} else {
			if (node[root].sz < x) cout << -1 << "\n";
			else cout << kth(root, node[root].sz - x + 1) + s<< "\n";
		}
	}
	cout << cnt;
	return 0;
}

包关注的

2025/1/23 10:17
加载中...