扩展域并查集70pts求调
查看原帖
扩展域并查集70pts求调
754502
_AyachiNene楼主2023/6/14 18:21
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int x,y,op;
}a[114514];
int n,m,f[114514],b[114514],cnt,sum;
int find(int x)
{
	if(f[x]==x)
		return x;
	return f[x]=find(f[x]);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=1e5;i++)
		f[i]=i;
	for(int i=1;i<=m;i++)
	{
		string s;
		cin>>a[i].x>>a[i].y>>s;
		if(s[0]=='o')
			a[i].op=0;
		else
			a[i].op=1;
		b[++cnt]=a[i].x,b[++cnt]=a[i].y;
	}
	sort(1+b,1+b+cnt);
	sum=unique(b+1,b+1+cnt)-(b+1);
	for(int i=1;i<=m;i++)
	{
		a[i].x=lower_bound(b+1,b+1+sum,a[i].x-1)-b;
		a[i].y=lower_bound(b+1,b+1+sum,a[i].y)-b;
	} 
//	for(int i=1;i<=m;i++)
//		cout<<a[i].x<<" "<<a[i].y<<endl;
	for(int i=1;i<=m;i++)
	{
		if(a[i].op==0)
		{
			if(find(a[i].x)==find(a[i].y+sum)||find(a[i].x+sum)==find(a[i].y))
			{
				cout<<i-1;
				return 0;
			}
			else
			{
				f[find(a[i].x)]=find(a[i].y);
				f[find(a[i].x+sum)]=find(a[i].y+sum);
			}
		}
		else
		{
			if(find(a[i].x)==find(a[i].y)||find(a[i].x+sum)==find(a[i].y+sum))
			{
				cout<<i-1;
				return 0;
			}
			else
			{
				f[find(a[i].x)]=find(a[i].y+sum);
				f[find(a[i].x+sum)]=find(a[i].y);
			}
		}
	}
	cout<<m;
}
2023/6/14 18:21
加载中...