求救求救,100pts的主席树只得了50pts,嘤嘤嘤
查看原帖
求救求救,100pts的主席树只得了50pts,嘤嘤嘤
73847
OYBDOOO楼主2020/6/9 21:53

求救求救,100pts的主席树只得了50pts,嘤嘤嘤,就是所谓IOI挑战的那些点

#include<bits/stdc++.h>
using namespace std;
int sj=0;
int ttt=0;
int len[100100];
char zj[1001000];
int lc[1001000];
int rc[1001000];
int rt[100100];
int m;
void modi(int &now,int pre,char o,int ll,int rr,int pos)
{
	if(now==0)now=++ttt;
	
	if(ll==rr)
	{
		zj[now]=o;
		return;
	}
	int mid=(ll+rr)/2;
	lc[now]=lc[pre];
	rc[now]=rc[pre];
	if(pos<=mid)modi(lc[now],lc[pre],o,ll,mid,pos);
	else modi(rc[now],rc[pre],o,mid+1,rr,pos);
}
char que(int now,int ll,int rr,int pos)
{
	if(ll==rr)
		return zj[now];
	int mid=(ll+rr)/2;
	if(pos<=mid)return que(lc[now],ll,mid,pos);
	else return que(rc[now],mid+1,rr,pos);
}
int main()
{
	char op[55],x[55];
	int i,aa;
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%s",op);
		if(op[0]=='T')
		{
			scanf("%s",x);
			sj++;
			len[sj]=len[sj-1]+1;
			modi(rt[sj],rt[sj-1],x[0],1,m,len[sj]);
		}
		else if(op[0]=='U')
		{
			scanf("%d",&aa);
			sj++;
			rt[sj]=rt[sj-aa-1];
			len[sj]=len[sj-aa-1];
		}
		else
		{
			scanf("%d",&aa);
			cout<<que(rt[sj],1,m,aa)<<endl;
		}
	}
	return 0;
}
2020/6/9 21:53
加载中...