左偏树 WA 0pts 求助
查看原帖
左偏树 WA 0pts 求助
367521
roger_yrj楼主2023/9/10 13:52
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m;
int dis[N],vis[N],f[N],ls[N],rs[N],v[N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int merge(int x,int y){
	if(!x||!y)return x+y;
	if(v[y]<v[x])swap(x,y);//大的挂在小的上 
	rs[x]=merge(rs[x],y);//左偏所以挂右边 
	if(dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
	dis[x]=dis[rs[x]]+1;
	return x;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)scanf("%d",&v[i]),f[i]=i;
	cin>>m;
	while(m--){
		char op;int x,y;getchar();
		op=getchar();
		if(op=='M'){
			scanf("%d%d",&x,&y);
			if(vis[x]||vis[y])continue;
			x=find(x),y=find(y);
			if(x!=y)f[x]=f[y]=merge(x,y);
		}else{
			scanf("%d",&x);
			if(vis[x]){printf("0\n");continue;}
			x=find(x);
			printf("%d\n",v[x]);
			vis[x]=1;
			f[ls[x]]=f[rs[x]]=f[x]=merge(ls[x],rs[x]);
			ls[x]=rs[x]=dis[x]=0;
		}
	}
	return 0;
} 
2023/9/10 13:52
加载中...