如果[st,ed]区间和为偶数,那么前缀和sum[st-1]和sum[ed]的奇偶性相同,可以放入同一集合中。
如果[st,ed]区间和为奇数,那么前缀和sum[st-1]和sum[ed]的奇偶性不同,可以将~sum[st-1]和sum[ed]放入同一集合中,sum[st-1]和~sum[ed]放入同一集合中。
用并查集可以实现检验和合并操作。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
const int MAXM=50050;
int st[MAXM],ed[MAXM],fa[MAXN<<1];
bool dif[MAXM];
int findfa(int x)
{
return fa[x]==x?x:(fa[x]=findfa(fa[x]));
}
int main()
{
int n,q,i,ans;
char str[10];
while(~scanf("%d%d",&n,&q))
{
for(i=1;i<=q;i++)
{
scanf("%d%d %s",&st[i],&ed[i],&str);
if(str[0]=='e')
dif[i]=0;
else
dif[i]=1;
}
ans=-1;
for(i=0;i<=(n<<1);i++)
fa[i]=i;
for(i=1;i<=q;i++)
{
if(dif[i])
{
if(findfa(st[i]-1)==findfa(ed[i])&&findfa(st[i]-1+n)==findfa(ed[i]+n))
{
ans=i;
break;
}
else
{
fa[findfa(ed[i]+n)]=findfa(st[i]-1);
fa[findfa(st[i]-1+n)]=findfa(ed[i]);
}
}
else
{
if(findfa(st[i]-1)==findfa(ed[i]+n)&&findfa(st[i]-1+n)==findfa(ed[i]))
{
ans=i;
break;
}
else
{
fa[findfa(ed[i])]=findfa(st[i]-1);
fa[findfa(ed[i]+n)]=findfa(st[i]-1+n);
}
}
}
if(ans!=-1)
printf("%d\n",ans);
else
printf("-1\n");
}
}