fhqTreap+并查集求助

P3224 [HNOI2012] 永无乡

```cpp #include<bits/stdc++.h> using namespace std; struct Point{ int l,r,siz,rnd; int val,k;//k is id }; #define N 100001 struct fhqTreap{ private: Point q[N]; int nw,root[N],rootX,rootY,fa[N]; int New(int val,int k){ q[++nw].val=val; q[nw].k=k; q[nw].siz=1; q[nw].rnd=rand(); return nw; } void Update(int id){ q[id].siz=q[q[id].l].siz+q[q[id].r].siz+1; } void Split(int id,int key,int &idX,int &idY){ if(id==0) idX=idY=0; else{ if(q[id].val<=key){ idX=id; Split(q[id].r,key,q[id].r,idY); } else{ idY=id; Split(q[id].l,key,idX,q[id].l); } Update(id); } } int Merge(int idX,int idY){//both normal & special if(idX==0 || idY==0) return idX+idY; if(q[idX].val<=q[idY].val){ if(q[idX].rnd<=q[idY].rnd){ q[idX].r=Merge(q[idX].r,idY); Update(idX); return idX; } else{ q[idY].l=Merge(idX,q[idY].l); Update(idY); return idY; } } else{ if(q[idX].rnd<=q[idY].rnd){ q[idY].r=Merge(idX,q[idY].r); Update(idY); return idY; } else{ q[idX].l=Merge(q[idX].l,idY); Update(idX); return idX; } } } int Get(int id){//for fa if(fa[id]!=id) fa[id]=Get(fa[id]); return fa[id]; } public: void Init(){ nw=0; memset(root,0,sizeof(root)); memset(fa,0,sizeof(fa));//not a must } void Insert(int val,int k,int kind){//k == kind Split(root[kind],val,rootX,rootY); root[kind]=Merge(Merge(rootX,New(val,k)),rootY); fa[k]=k; } void Build(int kindX,int kindY){ root[kindX]=root[kindY]=Merge(root[kindX],root[kindY]); fa[Get(kindX)]=Get(kindY); } int Find(int id,int rank){ id=root[Get(id)]; while(1){ if(q[q[id].l].siz>=rank) id=q[id].l; else if(q[q[id].l].siz+1==rank) return q[id].k!=0?q[id].k:-1; else{ rank-=(q[q[id].l].siz+1); id=q[id].r; } } } }; #undef N fhqTreap q; int n,m; int main(){ freopen("input.in","r",stdin); freopen("output.txt","w",stdout); srand(time(0)); q.Init(); scanf("%d%d",&n,&m); int x,y; for(int i=1;i<=n;i++){ scanf("%d",&x); q.Insert(x,i,i); } for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); q.Build(x,y); } scanf("%d",&m); char tmpS[5]; while(m--){ scanf("%s%d%d",tmpS,&x,&y); if(tmpS[0]=='Q'){ printf("%d\n",q.Find(x,y)); } else{ q.Build(x,y); } } return 0; } ```
by 7k1danWhen @ 2022-03-29 22:03:32


两个freopen是我本地调试用的,请各位大佬忽略
by 7k1danWhen @ 2022-03-29 22:04:09


|