萌新刚学可持久化线段树,样例过了,但是WA0pts,求调
查看原帖
萌新刚学可持久化线段树,样例过了,但是WA0pts,求调
661641
Cx114514楼主2023/11/27 19:33
#include <bits/stdc++.h>
using namespace std;

int cnt, n, stand[100005], len[100005];

struct node
{
	int lc, rc;
	char val;
} tree[2000005];

int build(int l, int r)
{
	cnt++;
	int p = cnt;
	if (l == r) return p;
	int mid = (l + r) / 2;
	tree[p].lc = build(l, mid);
	tree[p].rc = build(mid + 1, r);
	return p;
}

int insert(int rt, int l, int r, int t, char x)
{
	cnt++;
	int p = cnt;
	tree[p] = tree[rt];
	if (l == r)
	{
		tree[p].val = x;
		return p;
	}
	int mid = (l + r) / 2;
	if (t <= mid) tree[p].lc = insert(tree[rt].lc, l, mid, t, x);
	else tree[p].rc = insert(tree[rt].rc, mid + 1, r, t, x);
	return p;
}

char query(int rt, int l, int r, int t)
{
	if (l == r) return tree[rt].val;
	int mid = (l + r) / 2;
	if (t <= mid) return query(tree[rt].lc, l, mid, t);
	return query(tree[rt].rc, mid + 1, r, t);
}

int main()
{
	cin >> n;
	int m = n;
	stand[0] = build(1, n);
	int jsq = 0;
	while (m--)
	{
		char c;
		cin >> c;
		if (c == 'T')
		{
			char x;
			cin >> x;
			len[++jsq] = len[jsq - 1] + 1;
			stand[jsq] = insert(stand[jsq - 1], 1, n, len[jsq], x);
		}
		else if (c == 'U')
		{
			int x;
			cin >> x;
			stand[++jsq] = stand[jsq - x - 1];
			len[jsq] = len[jsq - x - 1];
		}
		else
		{
			int x;
			cin >> x;
			cout << query(stand[jsq], 1, n, x) << endl;
		}
	}
    return 0;
}


2023/11/27 19:33
加载中...