救救孩子,不知道为啥MLE了
查看原帖
救救孩子,不知道为啥MLE了
127925
Kio_楼主2020/8/18 23:40

RT,不知道是数组开太大了还是爆栈了......

但是测试了下,数组即使开成 j[15002]j[15002] 也还是会MLE;

而且看了眼题解,题解也用的递归求根节点,应该没出现爆栈的情况......

于是就懵了

代码:

#include<cstdio>
using namespace std;
int j[150020];
int find(int x)
{
	if(x!=j[x])find(j[x]);
	return j[x];
}
void _union(int x,int y)
{
	j[find(x)]=find(y);
}
int read()
{
	int num=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while('0'<=c&&c<='9')num=num*10+c-'0',c=getchar();
	return num;
}
int n,k,z,x,y,ans;
int main(){
	n=read(),k=read();
	for(int i=1;i<=n*3;i++)
	{
		j[i]=i;
	}
	for(int i=1;i<=k;i++)
	{
		z=read(),x=read(),y=read();
		if(x>n||y>n||x==y){
			ans++;
			continue;
		}
		if(z==1){
			if(find(x)==find(y+n)||find(y+n+n)==find(x))ans++;
			else{
				_union(x,y);
				_union(x+n,y+n);
				_union(x+n+n,y+n+n);
			}
		}
		else{
			if(find(x)==find(y)||find(y+n)==find(x)){
				ans++;
			}else{
				_union(x,y+n);
				_union(x+n,y+n+n);
				_union(x+n+n,y);
			}
		}
	}
	printf("%d",ans);
	return 0;
}

求大佬指教QwQ

2020/8/18 23:40
加载中...