社区讨论
关于fhq-treap查询的写法
灌水区参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @locbb1a2
- 此快照首次捕获于
- 2023/10/30 11:00 2 年前
- 此快照最后确认于
- 2023/11/04 22:47 2 年前
这道题我用这种写法,Tle 19个点 :
CPPint 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 :
CPPint 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 条回复,欢迎继续交流。
正在加载回复...