主席树版子题求调(代码极简)
查看原帖
主席树版子题求调(代码极简)
471571
封禁用户楼主2023/9/1 17:43

个人感觉问题出在 updateupdate 上了

#include<bits/stdc++.h>
#define M 300001
#define inf 2e9
#define ls p<<1
#define rs p<<1|1
using namespace std;
inline int read()
{
   int k=0,f=0;char c=getchar();
   for(;!isdigit(c);c=getchar()) f|=c=='-';
   for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
   return f?-k:k;
}
int n,idx;
int node,root[M];
string s;
struct tree
{
   int val,lson,rson;
}t[M<<5];
int build(int l,int r)
{
   int rt=++node,mid=(l+r)>>1;
   if(l==r) return rt;
   t[rt].lson=build(l,mid),t[rt].rson=build(mid+1,r);
   return rt;
}
int update(int pre,int l,int r,int idx,int x)
{
   int rt=++node,mid=(l+r)>>1;
   t[rt].lson=t[pre].lson,t[rt].rson=t[pre].rson;
   if(l==r)
   {
   	t[rt].val=x;
   	return rt;
   }
   if(idx<=mid) t[rt].lson=update(t[pre].lson,l,mid,idx,x);
   else t[rt].rson=update(t[pre].rson,mid+1,r,idx,x);
   return rt;
}
int query(int p,int l,int r,int x)
{
   if(l==r) return t[p].val;
   int mid=(l+r)>>1;
   if(x<=mid) return query(t[p].lson,l,mid,x);
   else return query(t[p].rson,mid+1,r,x);
}
char get(int k)
{
   return k+'a';
}
int main()
{
   n=read();
   root[0]=build(1,n);
   for(int i=1;i<=n;i++)
   {
   	cin>>s;
   	if(s=="T")
   	{
   		idx++;
   		cin>>s;
   		int x=s[0]-'a';
   		root[idx]=update(root[idx-1],1,n,idx,x);
   	}
   	else if(s=="U")
   	{
   		int k=read();
   		idx-=k;
   		node=root[idx];
   	}
   	else
   	{
   		int x=read();
   		int ans=query(root[idx],1,n,x);
   		printf("%c\n",get(ans));
   	}
   }
   return 0;
}
2023/9/1 17:43
加载中...