此代码为何加上dep[0]=-1就WA #11 93pt
查看原帖
此代码为何加上dep[0]=-1就WA #11 93pt
54372
A_Đark_Horcrux楼主2021/8/16 18:21
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10; 
inline int read()
{
	int s=0,b=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') b=-1; c=getchar();}
	while(c>='0'&&c<='9') s=(s<<3)+(s<<1)+(c&15),c=getchar();
	return s*b;
}
int fa[N],v[N],ls[N],rs[N],dep[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int merge(int x,int y)//合并
{
	if(!x||!y) return x+y;
	if(v[x]>v[y]) swap(x,y);
	rs[x]=merge(rs[x],y);
	if(dep[ls[x]]<dep[rs[x]]) swap(ls[x],rs[x]);
	fa[ls[x]]=fa[rs[x]]=fa[x]=x,dep[x]=dep[rs[x]]+1;
	return x;
}
void pop(int x)//出
{
	v[x]=-1;
	fa[ls[x]]=ls[x],fa[rs[x]]=rs[x];
	fa[x]=merge(ls[x],rs[x]);
	return ;
}
int n,m,opt,x,y;
int main()
{
	n=read(); m=read();
	for(int i=1;i<=n;i++) 
		scanf("%d",&v[i]),fa[i]=i;
   //dep[0]=-1;
	while(m--)
	{
		opt=read();
		if(opt==1)
		{
			x=read(),y=read();
			if(v[x]!=-1&&v[y]!=-1)
			{
				int p=find(x),q=find(y);
				if(p!=q) fa[p]=fa[q]=merge(p,q);
			}
		}
		else
		{
			x=read();
			if(v[x]==-1) printf("-1\n");
			else printf("%d\n",v[find(x)]),pop(find(x));
		}
	}
	return 0;
}

2021/8/16 18:21
加载中...