題意
區間長度爲n,給定m個關係,然後三個輸入l,r,s(字符) ,如果s="even"表示(l,r) 有偶數個1,如果s="odd"表示(l,r) 有奇數個1,求k使得1-k個條件都能滿足要求,而k+1個條件不能滿足.
思路
邊帶權並查集,記錄與父親節點之間有偶數個1還是奇數個1,當權值爲1時時偶數個1,當權值爲0時爲偶數個1.
代碼
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
int l,r,id;
}a[maxn];
int t[maxn],fa[maxn],d[maxn];
int find(int x){
if(x==fa[x]) return x;
int fx=find(fa[x]);
d[x]^=d[fa[x]];
return fa[x]=fx;
}
int main(){
int n,m;scanf("%d%d",&n,&m);
int tot=0;
for(int i=1;i<=m;i++){
char s[5];
scanf("%d%d%s",&a[i].l,&a[i].r,s);
a[i].id=s[0]=='e'?0:1;
t[++tot]=a[i].l-1;
t[++tot]=a[i].r;
}
sort(t+1,t+tot+1);
tot=unique(t+1,t+tot+1)-t-1;
for(int i=1;i<=tot;i++) fa[i]=i;
int ans=m,flag=0;
for(int i=1;i<=m;i++){
int x=lower_bound(t+1,t+tot+1,a[i].l-1)-t;
int y=lower_bound(t+1,t+tot+1,a[i].r)-t;
int fx=find(x),fy=find(y);
if(fx==fy) {
if((d[x]^d[y])!=a[i].id){
ans=i-1;
flag=1;
break;
}
}
else {
fa[fx]=fy;
d[fx]=d[x]^d[y]^a[i].id;
}
}
printf("%d\n",ans);
//system("pause");
}