求助
查看原帖
求助
791039
tianzekai楼主2024/12/16 21:50

Treap合并写的,为什么我本地跑过了#1,也没爆栈,交上去#1却MLE了,别的点也都过了

#include <bits/stdc++.h>
using namespace std;
struct o{int lson,rson,key,siz,val,id;}l[400001];
int n,m,u,v,fa[400001],rt[400001];
char c;
void update(int x){l[x].siz=l[l[x].lson].siz+l[l[x].rson].siz+1;}
int findf(int x){
	if(fa[x]!=x){
		return fa[x]=findf(fa[x]);
	}
	return x;
}
void rotateL(int &x){
	int y=l[x].rson; 
	l[x].rson=l[y].lson; 
	l[y].lson=x; 
	update(x); 
	update(y); 
	x=y;
}
void rotateR(int &x){
	int y=l[x].lson; 
	l[x].lson=l[y].rson; 
	l[y].rson=x; 
	update(x); 
	update(y); 
	x=y;
}
void add(int a,int &x,int f,int son){
	if(x==0){
		if(son==1){
			l[f].lson=a;
		}
		else{
			l[f].rson=a;
		}
		update(f);
		return;
	}
	if(l[a].val<=l[x].val){
		add(a,l[x].lson,x,1);
		update(x);
		if(l[l[x].lson].key>l[x].key){
			rotateR(x);
		}
	}
	else{
		add(a,l[x].rson,x,2);
		update(x);
		if(l[l[x].rson].key>l[x].key){
			rotateL(x);
		}
	}
}
void merge(int &x,int y){
	if(x==0){
		return;
	} 
	int ls=l[x].lson,rs=l[x].rson;
	l[x].lson=0;
	l[x].rson=0;
	merge(ls,y);
	merge(rs,y);
	l[x].siz=1;
	add(x,rt[y],0,0);
	update(x);
	update(y);
}
void check(int x,int y){
	int fx=findf(x),fy=findf(y);
	if(fx==fy){
		return;
	}
	if(l[fx].siz>l[fy].siz){
		swap(x,y);
		swap(fx,fy);
	}
	fa[x]=fy;
	merge(rt[x],fy);
}
int query(int x,int k){
	if(k>l[x].siz){
		return -1;
	}
	if(k==l[l[x].lson].siz+1){
		return l[x].id;
	}
	else if(k<=l[l[x].lson].siz){
		return query(l[x].lson,k);
	}
	else{
		return query(l[x].rson,k-l[l[x].lson].siz-1);
	}
}
int main(){
	srand(114514);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>l[i].val;  
		l[i].id=i;  
		rt[i]=i;
		fa[i]=i;
		l[i].key=rand();  
		l[i].siz=1;
	}
	while(m--){
		cin>>u>>v;
		check(u,v);
	}
	cin>>m;
	while(m--){
		cin>>c>>u>>v;
		if(c=='Q'){
			int f=rt[findf(u)];
			cout<<query(f,v)<<endl;
		}
		else{
			check(u,v);
		}
	}
	return 0;
}

2024/12/16 21:50
加载中...