食物链

建图种类并查集即可

#include <bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int fa[N],d[N];
int ask(int x)
{
    if(fa[x]!=x)
    {
        int root=ask(fa[x]);
        d[x]+=d[fa[x]];
        fa[x]=root;
    }
    return fa[x];
}

int main()
{
    for(int i=1;i<=N-5;i++) fa[i]=i;
    int n,T;
    cin>>n>>T;
    int res=0;
    while(T--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(c>n||b>n||(a==2&&b==c))  {res++; continue;}
        int pa=ask(b);
        int pb=ask(c);
        if(a==1)//b c同类
        {
            if(pa==pb)//假如关系确认
            {
                if((d[b]-d[c])%3!=0)    res++;
            }
            else//建立关系
            {
                fa[pa]=pb;
                d[pa]=d[c]-d[b];
            }
        }
        else//b 吃 c
        {
            if(pa==pb)//假如关系确认
            {
                if((d[b]-d[c]-1)%3!=0)    res++;
            }
            else//建立关系
            {
                fa[pa]=pb;
                d[pa]=d[c]-d[b]+1;
            }
        }
    }
    cout<<res<<endl;
    return 0;
}
/*
我们按权值并查集定义三类.
x%3==0表示与根同类
x%3==1表示可以吃根节点
x%3==2表示可以被根节点吃
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
*/
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

07-18 18:05
门头沟学院 Java
挂了&nbsp;正式批求捞
投递滴滴等公司10个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-16 14:00
白火同学:其实你可以了解一下HR在Boss聊天的机制,想赢牌的前提是先会玩牌。 如果HR长时间没有理你,有可能是因为你的消息被其他应聘者的消息给挤到下面了,HR从上到下有可能只看个三四百个人就要到理想数量的简历了,而你恰好没有被看到,时间一长,你的消息在越来越下面。这种情况就需要你自己活跃一下,把消息提上去。 也可能是HR招的合适的人选了,但会一直挂着岗位,为了省重新开招聘岗位的钱,方便后面随时修改招聘要求。 当然也可能是HR吃饱了没事耍你玩,要了你的简历又不看,就看你自己怎么理解了。
点赞 评论 收藏
分享
zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务