社区讨论

关于fhq-treap查询的写法

灌水区参与者 4已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@locbb1a2
此快照首次捕获于
2023/10/30 11:00
2 年前
此快照最后确认于
2023/11/04 22:47
2 年前
查看原帖
这道题我用这种写法,Tle 19个点 :
CPP
int Rank(int x,int rt){
	int now=rt,ans=0;
	while(1){
		if(Val(now)>x){now=Son(now,0);}
		else{
			ans+=Siz(Son(now,0))+1;
			if(Val(now)==x){return ans;}
			else{now=Son(now,1);}
		}
	}
}

int Kth(int x,int rt){
	int now=rt;
	while(1){
		if(!now){return kInf;}
		if(Siz(Son(now,0))>=x){now=Son(now,0);}
		else if(Siz(Son(now,0))+1==x){return Val(now);}
		else{
			x-=Siz(Son(now,0))+1;
			now=Son(now,1);
		}
	}
}
用这种写法,AC :
CPP
int Pre(int k,int &rt){//前缀
	Split(rt,k-1,x,y);
	int res=Kth(Siz(x),x);
	rt=Merge(x,y);
	return res==kInf?-kInf:res;
}

int Suf(int k,int &rt){//后缀
	Split(rt,k,x,y);
	int res=Kth(1,y);
	rt=Merge(x,y);
	return res;
}
请问这两种写法有什么不同吗?

回复

6 条回复,欢迎继续交流。

正在加载回复...