20分求改,剩下TLE了
查看原帖
20分求改,剩下TLE了
1088913
xiaohaowen楼主2024/8/7 08:03

拿了20分,剩下TLE和WA

#include <bits/stdc++.h>
using namespace std;
int fa[100001],d[100001];
int find(int x){
	int r=x;
	while(fa[r]!=r){
		r=fa[r];
	}/*
	while(x!=r){
		int t=x;
		x=fa[x];
		fa[t]=r;
	}*/
	return r;
}
int calc(int x)
{
	int s=0;
	int r=x;
	while(fa[r]!=r){
		s+=d[r];
		r=fa[r];
	}return s;
}
void join(int a,int b){
	if(a!=b){
		fa[b]=a;
	}
}

int main(){
	int n,m;
	cin>>n>>m;
	int cnt=0;
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}for(int i=1;i<=m;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if((x>n||y>n)||(op==2&&x==y)){
			cnt++;
			continue;
		}
		int fx=find(x),fy=find(y);
		int sx=calc(x),sy=calc(y);
		if(fx==fy)
		{
			int s=(sx-sy+3000000)%3;
			if(s<0) s+=3;
			if(s==1&&op==2){
				continue;
			}else if(s==0&&op==1){
				continue;
			}else{
				cnt++;
				continue;
			}
		}
		else
		{
			if(op==1){
				fa[fx]=fy;
				d[fx]=(30000000-d[x]+d[y])%3;
			}else if(op==2){
				fa[fx]=fy;
				d[fx]=(30000000-d[x]+d[y]+1)%3;
			}else{
				cnt++;
				continue;
			}
		}
	}cout<<cnt;
	return 0;
}

求大神指点 如果给了修改的代码写下注释不然本蒟蒻看不懂

2024/8/7 08:03
加载中...