奇怪的现象....
查看原帖
奇怪的现象....
1097790
r1325楼主2024/10/5 00:47

发现当代码如下时,除了最后一个点会tle,其他点都可以过,但是这个写法显然是错误的:

#include <iostream>
#define MAXN 100005

using namespace std;

inline int read(){
	int x=0,k=1;
	char temp=0;
	while(temp>'9'||temp<'0'){if(temp=='-')k=-1;temp=getchar();}
	while(temp<='9'&&temp>='0'){x=x*10+(temp-'0');temp=getchar();}
	return x*k;
}

inline void wrt(int x){
	if(x<0){putchar('-');wrt(-1*x);return;}
	if(x/10)wrt(x/10);
	putchar(x%10+'0');
}

int v[MAXN],lc[MAXN],rc[MAXN],dis[MAXN],fa[MAXN];

int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}

int merge(int x,int y){
	if(!x||!y) return x+y;
	if(v[x]==v[y]?x>y:v[x]>v[y])swap(x,y);
	rc[x]=merge(rc[x],y);
	if(dis[lc[x]]<dis[rc[y]])swap(lc[x],rc[x]);//这里本来是if(dis[lc[x]]<dis[rc[x]])swap(lc[x],rc[x])
	dis[x]=dis[rc[x]]+1;
	return x;
}

int n=0,m=0,opt=0,x=0,y=0;

int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){v[i]=read();fa[i]=i;}
	dis[0]=-1;
	while(m--){
		opt=read(),x=read();
		if(opt==1){
			y=read();
			if(v[x]==-1||v[y]==-1)continue;
			x=find(x);y=find(y);
			if(x!=y)fa[x]=fa[y]=merge(x,y);
		}else{
			if(v[x]==-1){wrt(-1);putchar('\n');continue;}
			x=find(x);
			wrt(v[x]);putchar('\n');
			v[x]=-1;
			fa[lc[x]]=fa[rc[x]]=fa[x]=merge(lc[x],rc[x]);
		}
	}
}
2024/10/5 00:47
加载中...