关于可持久化线段树的疑问
  • 板块学术版
  • 楼主HotWood
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/8/10 09:34
  • 上次更新2023/11/3 04:48:50
查看原帖
关于可持久化线段树的疑问
538439
HotWood楼主2023/8/10 09:34

rt,P1383的代码,去掉t[p].ls=++tot;t[p].rs=++tot; 会WA一半的点 加上就过了

#include<bits/stdc++.h>
using namespace std;
const long long N=15000000;
long long tot=0,n,root[N],m,sum=0,len[N];
struct xds{
	struct treee{
		long long data,ls,rs;
	}t[N<<2];
	long long find(long long &p,long long l,long long r,long long K){
		if(l==r){
			return t[p].data;
		}
		long long mid=(l+r)/2;
		if(mid>=K)return find(t[p].ls,l,mid,K);
		if(mid<K)return find(t[p].rs,mid+1,r,K);
	}
	void newpo(long long &p,long long &i,long long l,long long r,long long num,long long x){
		if(!p)p=++tot;
		t[p]=t[i];
		if(l==r){
			t[p].data=x;
			return ;
		}
		long long mid=(l+r)/2;
		if(mid>=num){
			//t[p].ls=++tot;这里
			newpo(t[p].ls,t[i].ls,l,mid,num,x);
		}
		if(mid<num){
			//t[p].rs=++tot;这里
			newpo(t[p].rs,t[i].rs,mid+1,r,num,x);
		}
	}
}f;
int main(){
	ios::sync_with_stdio(0);
	cin>>n;
	for(long long i=1;i<=n;i++){
		char ck;
		cin>>ck;
		if(ck=='T'){
			char te;
			cin>>te;
			++sum;
			len[sum]=len[sum-1]+1;
			f.newpo(root[sum],root[sum-1],1,n,len[sum],(long long)te);
		}else if(ck=='U'){
			long long x;
			cin>>x;
			++sum;
			long long hs=max(0,sum-x-1);
			root[sum]=root[hs];
			len[sum]=len[hs];
		}else if(ck=='Q'){
			long long x;
			cin>>x;
			long long an=f.find(root[sum],1,n,x);
			cout<<((char)an)<<"\n";
		}
	}
	return 0;
}
2023/8/10 09:34
加载中...