样例都过不了求助
查看原帖
样例都过不了求助
374851
lian13817981484楼主2023/11/2 17:19
#include<cstdio>
#include<algorithm>
using namespace std;
inline int max(int a,int b){
	return a < b ? b : a;
}
const int N = 200015;
struct node{
	int l,r,sum;
	char data;
}tree[N*20];
int n,tot = 0,cnt = 1,arr[N],brr[N],root[N],noww;
void pushup(int now){
	tree[now].sum = tree[tree[now].l].sum+tree[tree[now].r].sum;
}
void update(int &now,int v,int l,int r,char w){
	if(now == 0)now = ++tot;
	tree[now] = tree[v];
	if(l == r){
		tree[now].sum = 1;
		tree[now].data = w;
		return;
	}
	int mid = l+r>>1;
	if(tree[tree[now].l].sum < mid-l+1){
		update(tree[now].l,tree[v].l,l,mid,w);
	}
	else{
		update(tree[now].r,tree[v].r,mid+1,r,w);
	}
	pushup(now);
}
char query(int now,int l,int r,int k){
	if(l == r){
		return tree[now].data;
	}
	int mid = l+r>>1,sum = tree[tree[now].l].sum;
	if(k <= sum)return query(tree[now].l,l,mid,k);
	return query(tree[now].r,mid+1,r,k-sum);
}
char str[15],str2[5];
int main(){
	scanf("%d",&n);
	for(int i = 1;i <= n;i++){
		scanf("%s",str);
		if(str[0] == 'T'){
			scanf("%s",str2);
			cnt++;
			update(root[cnt],root[cnt-1],1,n,str2[0]);
		}
		else if(str[0] == 'U'){
			scanf("%d",&noww);
			cnt++;
			root[cnt] = root[cnt-noww-1];
		}
		else{
			scanf("%d",&noww);
			printf("%c\n",query(root[cnt],1,n,noww));
		}
	}
	return 0;
}

提交过一遍

2023/11/2 17:19
加载中...