96ptsRE求调
查看原帖
96ptsRE求调
1228172
Asona_s_dog楼主2024/10/9 21:56
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 1e6;
int n, tot, root[N], q, len[N], siz = 1;
struct node{
	int ls, rs;
}t[N << 4];
char s[N];
int build(int l, int r) {
	int rt = ++tot;
	if(l < r) {
		int mid = (l + r) >> 1;
		t[rt].ls = build(l, mid);
		t[rt].rs = build(mid + 1, r);
	}
	return rt;
}
int update(int pre, int l, int r, int pos, char c) {
	int rt = ++tot;
	t[rt].ls = t[pre].ls, t[rt].rs = t[pre].rs;
	if(l == r) {
		s[rt] = c;
		return rt;
	}
	int mid = (l + r) >> 1;
	if(pos <= mid) t[rt].ls = update(t[rt].ls, l, mid, pos, c);
	else           t[rt].rs = update(t[rt].rs, mid + 1, r, pos, c);
	return rt;
}
int query(int p, int l, int r, int pos) {
	if(l == r) return s[p];
	int mid = (l + r) >> 1;
	if(pos <= mid) return query(t[p].ls, l, mid, pos);
	else           return query(t[p].rs, mid + 1, r, pos);
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> q;
	n = q;
	root[0] = build(1, n);
	while(q--) {
		char opt;
		cin >> opt;
		if(opt == 'T') {
			char c;
			cin >> c;
			siz++;
			len[siz] = len[siz - 1] + 1;
			root[siz] = update(root[siz - 1], 1, n, len[siz], c);
		}
		else if(opt == 'U') {
			int x;
			cin >> x;
			siz++;
			len[siz] = len[siz - x - 1];
			root[siz] = root[siz - x - 1];
		}
		else {
			int x;
			cin >> x;
			x++;
			cout << (char)query(root[siz], 1, n, x) << '\n';
		}
	}
}
如题, 蒟蒻求各位大佬帮帮忙
2024/10/9 21:56
加载中...