主席树求条,全wa
查看原帖
主席树求条,全wa
906970
Jerry_Money楼主2025/1/22 15:20
#include<bits/stdc++.h>
#define mid ((l+r)/2)
#define int long long
#define f(x) x-'a'+1
using namespace std;
int n;
int tot;
int tot_rt;
int root[10000086];
struct sb{
	int ls,rs;
	char data='.';
	int sum;
}a[1000086];
int newNode(){
	return ++tot;
}
int build_tree(int l,int r){
	int node=newNode();
	if(l==r){
		return node;
	}
	a[node].ls=build_tree(l,mid);
	a[node].rs=build_tree(mid+1,r);
	return node;
}
int build_chain(int x,int l,int r,char data){
	int node=newNode();
	a[node].ls=a[x].ls,a[node].rs=a[x].rs;
	a[node].sum=a[x].sum+1;
	if(l==r){
		a[node].data=data;
		return node;
	}
	if(f(data)<=mid){
		a[node].ls=build_chain(a[x].ls,l,mid,data);
	}
	else{
		a[node].rs=build_chain(a[x].rs,mid+1,r,data);
	}
	return node;
}
int getkth(int x,int l,int r,int k){
	if(l==r)return x;
	if(k<=a[a[x].ls].sum)return getkth(a[x].ls,l,mid,k);
	else return getkth(a[x].rs,mid+1,r,k-a[a[x].ls].sum);
}
signed main()
{
	cin>>n;
	root[0]=build_tree(1,n);
	for(int i=1;i<=n;i++){
		char op;
		cin>>op;
		if(op=='T'){
			char x;cin>>x;
			++tot_rt;root[tot_rt]=build_chain(root[tot_rt-1],1,n,x);
		}
		else if(op=='U'){
			int x;cin>>x;
			++tot_rt;root[tot_rt]=root[tot_rt-1-x];
		}
		else{
			int x;cin>>x;
			cout<<a[getkth(root[tot_rt],1,n,x)].data<<"\n";
		}
	}
	return 0;
}
2025/1/22 15:20
加载中...