AcWing 239. 奇偶游戏

小A和小B在玩一个游戏。

首先,小A写了一个由0和1组成的序列S,长度为N。

然后,小B向小A提出了M个问题。

在每个问题中,小B指定两个数 l 和 r,小A回答 S[l~r] 中有奇数个1还是偶数个1。

机智的小B发现小A有可能在撒谎。

例如,小A曾经回答过 S[1~3] 中有奇数个1, S[4~6] 中有偶数个1,现在又回答 S[1~6] 中有偶数个1,显然这是自相矛盾的。

请你帮助小B检查这M个答案,并指出在至少多少个回答之后可以确定小A一定在撒谎。

即求出一个最小的k,使得01序列S满足第1~k个回答,但不满足第1~k+1个回答。

#include<bits/stdc++.h>
#define N 40010
#define M N/2
using namespace std;
int n,m;
int fa[N],d[N];
map<int,int>s;
int get(int x)
{
    if(s.count(x)==0)s[x]=++n;
    return s[x];
}
int found(int x) 
{
    if (fa[x]!=x) fa[x]=found(fa[x]);
    return fa[x];
}
int main()
{
    cin>>n>>m;n=0;
    int a,b;string type;
    for(int i=0;i<N;i++)fa[i]=i;
    for(int i=1;i<=m;i++) 
    {
        cin>>a>>b>>type;
         a=get(a-1),b=get(b);
        if(type=="even") 
        {
            if(found(a+M)==found(b)){cout<<i-1;return 0;}
            fa[found(a)]=found(b);
            fa[found(a+M)]=found(b+M);
        } 
        else 
        {
            if(found(a)==found(b)){cout<<i-1;return 0;}
            fa[found(a+M)]=found(b);
            fa[found(a)]=found(b+M);
        }
    }
    cout<<m;
    return 0;
}

 

posted @ 2021-02-01 09:13  君与  阅读(45)  评论(0编辑  收藏  举报