记录编号 586729 评测结果 AAAAAAAAAA
题目名称 [NOI 2001]食物链 最终得分 100
用户昵称 Gravatar超人 是否通过 通过
代码语言 C++ 运行时间 0.187 s
提交时间 2024-02-25 19:29:36 内存使用 10.64 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#include<bits/stdc++.h>
using namespace std;
const int M=1e6;
int n,m,ans=0;
int eatA[M],eatB[M];
int income(int x)
{
    if(eatA[x]==x) return x;
    int f=eatA[x];
    eatA[x]=income(eatA[x]);
    eatB[x]=(eatB[x]+eatB[f])%3;
    return eatA[x];                                    
}
bool upcome(int N,int O,int I)                        
{
    int a=income(O),b=income(I);
    if(a==b)
    {
        if(N==1)
        {
            if(eatB[O]!=eatB[I]) return false;
        }
        if(N==2)
        {
            if(eatB[O]==1 && eatB[I]!=0) return false;
            if(eatB[O]==2 && eatB[I]!=1) return false;
            if(eatB[O]==0 && eatB[I]!=2) return false;
        }
        return true;
    }
    else
    {
        eatA[a]=b;
        if(N==2) eatB[a]=(eatB[I]-eatB[O]+3+1)%3;
        if(N==1) eatB[a]=(eatB[I]-eatB[O]+3)%3;
        a=income(O);
        b=income(I);
        return true;
    }
}
int main()
{
    freopen("eat.in","r",stdin);
    freopen("eat.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++) eatA[i]=i;
    for(int i=1;i<=m;i++)
    {
        int N,O,I;
        cin>>N>>O>>I;
        if(O>n || I>n) ans++;
        else if(N==2 && O==I) ans++;
        else if(upcome(N,O,I)) continue;
        else ans++;
    }
    cout<<ans<<endl;
    return 0;
}