心态已炸,调了一天,还是WA
查看原帖
心态已炸,调了一天,还是WA
907667
thousands_of_years楼主2024/7/17 20:43

样例可过,但全wa

#include<bits/stdc++.h>
#define M 1000005
using namespace std;
char opt,sum[M<<5];
int last,cnt=0,lon,siz[M<<5],N,ll[M<<5],rr[M<<5],tt[M<<5];
int update(int nex,int l,int r,char pos)
{
//	cout<<l<<"@"<<r<<endl;
	int rt=++cnt;
	ll[rt]=ll[nex];
	rr[rt]=rr[nex];
	siz[rt]=siz[nex];
	sum[rt]=sum[nex];
	if(l<r)
	{
		int mid=l+r>>1;
		if(siz[ll[rt]]!=mid-l+1) ll[rt]=update(ll[nex],l,mid,pos);
		else rr[rt]=update(rr[nex],mid+1,r,pos);
		siz[rt]=siz[ll[rt]]+siz[rr[rt]];
	}
	if(l==r) 
	{
		sum[rt]=pos;
		siz[rt]=1;
	}
//	t[rt]=t[ll[rt]]+t[rr[rt]];
	return rt;
}
char find(int nex,int l,int r,int pos)
{
	if(l==r) {return sum[nex];}
    else
    {
        int mid=(l+r)/2;
//        cout<<t[ll[nex]];
        if(pos<=siz[ll[nex]]) return find(ll[nex],l,mid,pos); 
		else return find(rr[nex],mid+1,r,pos-ll[nex]);
    }
}
int main()
{
	cin>>N;
	for(int i=1;i<=N;i++)
	{
		cin>>opt;
		if(opt=='T')
		{
			char x;
			cin>>x;
			++lon;
			tt[lon]=update(tt[lon-1],1,N,x);
//			cout<<tt[lon-1]<<" "<<N<<" "<<x<<endl;
		}
		if(opt=='U')
		{
			int x;
			cin>>x;
			++lon;
			tt[lon]=tt[lon-x-1];
		}
		if(opt=='Q')
		{
			int x;
			cin>>x;
			cout<<find(tt[lon],1,N,x)<<endl;
		}
//		cout<<tt[lon];
	}
	return 0;
}
/*
7
T a
T b
T c
Q 2
U 2
T c
Q 2
*/
// Q p
/*
13
T A                           
T Q
T p
T y
Q 2
U 2
U 2
Q 3
T A
T A
U 3
U 4
Q 2
*/
2024/7/17 20:43
加载中...