求助,蒟蒻知道自己算法不对,但是想知道为什么会MLE8个点
查看原帖
求助,蒟蒻知道自己算法不对,但是想知道为什么会MLE8个点
357641
YyuanDa楼主2021/9/16 22:29
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstdio>
using namespace std;
//ifstream cin();
//ofstream cout();
//freopen("","r",stdin);
//freopen("","w",stdout);
const int N=5e4+5;
int n,f[N],k,ans=0;
int find(int x){
	if(f[x]==x) return f[x];
	return f[x]=find(f[x]);
}
int sz(int x){
	x-=n;
	if(x==1) return n+2;
	if(x==2) return n+3;
	return n+1;
}
bool valid(int x,int y){
	if(x==y) return 0;
	if(x==1&&y==3) return 0;
	if(x==2&&y==1) return 0;
	if(x==3&&y==2) return 0;
	return 1;
}
void debug(){
	cout<<"! "<<ans<<endl;
	for(int i=1;i<=5;i++) cout<<f[i]<<" ";
	cout<<endl;
} 
int main(){
	//A:n+1,B:n+2,C:n+3
	freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n+3;i++) f[i]=i;
	for(int i=1;i<=k;i++){
		int x,y,c;
		scanf("%d%d%d",&c,&x,&y);
		if(x>n||y>n) ans++;
		else if(c==1){
			int fx=find(x),fy=find(y);
			if(fx!=fy&&fx>n&&fy>n) ans++;
			else f[fy]=fx;
		}else {
			if(x==y){
				ans++;
				//debug();
				continue;
			}
			int fx=find(x),fy=find(y);
			if(fx>n&&fy>n) {
				fx-=n,fy-=n;
				if(!valid(fx,fy)) ans++;
			}else if(fx>n) {
				//printf("%d %d %d\n",24,fx,fy);
				f[fy]=sz(fx);	
			}
			 else if(fy>n) {
			 	//printf("%d %d %d\n",42,fx,fy);
			 	f[fx]=sz(fy);
			 }
			else f[fx]=n+1,f[fy]=n+2;
		}
		//debug();
	}
	cout<<ans;
	return 0;
}

2021/9/16 22:29
加载中...