30pts求助
查看原帖
30pts求助
767353
Oct0pus1楼主2023/7/22 20:24

调来调去只有30分,求助各位大佬

#include<bits/stdc++.h>
using namespace std;
const int L=1e5+10;
struct query{
	int l,r;
	bool k;
}q[L];
int fa[L],a[L],n,m;
char str[10];
inline int find(int x){
	if(x==fa[x])return x;
	return fa[x]=find(fa[x]);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d %s",&q[i].l,&q[i].r,str);
		q[i].l--;
		if(!strcmp(str,"even"))q[i].k=true;
		else q[i].k=false;
		a[2*i-1]=q[i].l;a[2*i]=q[i].r;
	}
	sort(a+1,a+2*m+1);
	int len=unique(a+1,a+2*m+1)-a-1;
	for(int i=1;i<=m;i++){
		q[i].l=lower_bound(a+1,a+len+1,q[i].l)-a;
		q[i].r=lower_bound(a+1,a+len+1,q[i].r)-a;
	}
//	printf("%d",len);
//	for(int i=1;i<=m;i++)printf("%d %d %d\n",q[i].l,q[i].r,q[i].k);
	for(int i=1;i<=2*len;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		if(q[i].k){
			if(find(q[i].l)==find(q[i].r+len) || find(q[i].r)==find(q[i].l+len) || find(q[i].l+len)==find(q[i].r) || find(q[i].r+len)==find(q[i].l)){
				printf("%d",i);return 0;
			}
			fa[find(q[i].l)]=find(q[i].r);
            fa[find(q[i].l+len)]=find(q[i].r+len);
		}else{
			if(find(q[i].l)==find(q[i].r)){
				printf("%d",i);return 0;
			}
			fa[find(q[i].r+len)]=find(q[i].l);
			fa[find(q[i].l+len)]=find(q[i].r);
		}
	}
	printf("%d",m);
	return 0;
}
2023/7/22 20:24
加载中...