【学习笔记】(模板复习)FHQ平衡树
对应模板:P3369 【模板】普通平衡树
点击查看代码
#include<bits/stdc++.h>
using namespace std;
inline int rd(){
int f=1,j=0;
char w=getchar();
while(w>'9'||w<'0'){
if(w=='-')f=-1;
w=getchar();
}
while(w>='0'&&w<='9'){
j=(j<<3)+(j<<1)+w-'0';
w=getchar();
}
return f*j;
}
mt19937 rnd(20060309);
const int N=100100,M=1000001;
int ls[M],rs[M],siz[M],sum[M],tag[M],tail;
int n,m,sumn[N],root;
unordered_map<int,int>Q;
void update(int u){
siz[u]=siz[ls[u]]+siz[rs[u]]+1;
return ;
}
void merge(int &aim,int l,int r){
if(l==0||r==0){
aim=l+r;
if(aim!=0)update(aim);
return ;
}
if(tag[l]>tag[r])aim=l,merge(rs[aim],rs[l],r);
else aim=r,merge(ls[aim],l,ls[r]);
update(aim);
return ;
}
void split_s(int &l,int &r,int u,int Siz){ //左子树 = Siz
if(u==0){
l=0;r=0;
return ;
}
if(siz[ls[u]]>=Siz)r=u,split_s(l,ls[r],ls[u],Siz);
else l=u,split_s(rs[l],r,rs[u],Siz-siz[ls[u]]-1);
update(u);
return ;
}
void split_k(int &l,int &r,int u,int Sum){ //左子树 < Sum
if(u==0){
l=0;r=0;
return ;
}
if(sum[u]>=Sum)r=u,split_k(l,ls[r],ls[u],Sum);
else l=u,split_k(rs[l],r,rs[u],Sum);
update(u);
return ;
}
int findmax(int u){ // 当前树最大点
if(rs[u]==0)return sum[u];
return findmax(rs[u]);
}
int findmin(int u){ //当前树最小点
if(ls[u]==0)return sum[u];
return findmin(ls[u]);
}
void add(int x){
Q[x]++;
int a;
split_k(a,root,root,x);
sum[++tail]=x;siz[tail]=1;tag[tail]=rnd();
merge(a,a,tail);
merge(root,a,root);
return ;
}
void del(int x){
if(!Q[x])return ;
Q[x]--;
int l,r,a;
split_k(l,root,root,x);
split_k(root,r,root,x+1);
split_s(a,root,root,1);
merge(root,l,root);
merge(root,root,r);
return ;
}
int findpla(int x){
int l,ansn;
split_k(l,root,root,x);
// cout<<"|"<<l<<endl;
ansn=siz[l];
merge(root,l,root);
return ansn+1;
}
int findk(int x){
int l,ansn;
split_s(l,root,root,x-1);
ansn=findmin(root);
merge(root,l,root);
return ansn;
}
int findpre(int x){
int l,ansn;
split_k(l,root,root,x);
ansn=findmax(l);
merge(root,l,root);
return ansn;
}
int findback(int x){
int l,ansn;
split_k(l,root,root,x+1);
ansn=findmin(root);
merge(root,l,root);
return ansn;
}
signed main(){
// freopen("P3369_3.in","r",stdin);
// freopen("ans.out","w",stdout);
// n=rd();
m=rd();
// for(int i=1;i<=n;i++)sumn[i]=rd();
// sort(sumn+1,sumn+1+m);
// for(int i=1;i<=n;i++)add(sumn);
int front=0,ans=0;
for(int i=1;i<=m;i++){
int x=rd(),y=rd();//^front;
// if(x==1)add(y);
// if(x==2)del(y);
// if(x==3)ans^=(front=findpla(y));
// if(x==4)ans^=(front=findk(y));
// if(x==5)ans^=(front=findpre(y));
// if(x==6)ans^=(front=findback(y));
if(x==1)add(y);
if(x==2)del(y);
if(x==3)printf("%d\n",findpla(y));
if(x==4)printf("%d\n",findk(y));
if(x==5)printf("%d\n",findpre(y));
if(x==6)printf("%d\n",findback(y));
}
// printf("%d",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】