主席树求调,没过样例
查看原帖
主席树求调,没过样例
167697
BartAllen楼主2024/12/29 16:12
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

int n, tot, root[N];

struct Sgt {
	int ls, rs, cnt;
	char dat;
	#define ls(p) t[p].ls
	#define rs(p) t[p].rs
	#define cnt(p) t[p].cnt
	#define dat(p) t[p].dat
} t[N << 5];

void update(int p) {
	cnt(p) = cnt(ls(p)) + cnt(rs(p));
}

int insert(int now, int l, int r, int delta) {
	int p = ++tot; t[p] = t[now];
	if (l == r) {
		cnt(p) = 1, dat(p) = delta;
		return p;
	}
	int mid = l + r >> 1;
	if (cnt(ls(p)) == mid - l + 1) rs(p) = insert(rs(now), mid + 1, r, delta);
	else ls(p) = insert(ls(now), l, mid, delta);
	update(p);
	return p;
}

char ask(int p, int l, int r, int x) {
	if (l == r) return dat(p);
	int mid = l + r >> 1;
	if (x <= cnt(ls(p))) return ask(ls(p), l, mid, x);
	else return ask(rs(p), mid + 1, r, x - cnt(ls(p)));
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n; int sum = 0;
	while (n--) {
		char opt, c; int x; cin >> opt;
		switch (opt) {
			case 'T':
				cin >> c; sum++;
				root[sum] = insert(root[sum - 1], 1, n, c);
				break;
			case 'U':
				cin >> x; sum++;
				root[sum] = root[sum - x - 1];
				break;
			case 'Q':
				cin >> x;
				cout << ask(root[sum], 1, n, x) << endl;
		}						
	}
	return 0;
}
2024/12/29 16:12
加载中...