做题记录:P2024 食物链(洛谷)

P2024 食物链

/*思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,
所以我们干脆建立三倍于n的空间,1~n这三分之一用来存第i只动物是A
的情况,n+1~2n这三分之一用来存第(i-n)只动物是B的情况,2n+1~3n这
三分之一用来存这只动物是C的情况。对于每一句话给出的关系,我们并
不知道其中的两个动物分别是属于哪一个种类的,所以我们就把每一种情
况都处理一遍。当两个属于同一个区间的动物被合并时,就代表它们是同
一个种类的;当两个属于不同区间的动物被合并时,就代表作为父节点的
那一只动物吃作为子节点的那一只动物。照这样处理每一句真话即可。判
断假话时,第2、3种假话是很容易判断的,若是第一种假话就这样判断:
如果说的是x与y是同类的话,就判断x有没有和不在同一区间的y合并(这
代表x吃y)以及y有没有和不在同一区间的x合并(这代表y吃x),如果有,
这就是假话;如果说的是x吃y,就判断x有没有和在同一区间的y合并(这代
表x和y是同类)以及y有没有和不在同一区间的x合并(这代表y吃x),如
果有,这就是假话。最后输出答案即可。*/
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<queue>
    using namespace std;
    int f[150005];//f[1~n]存动物A,f[n+1~2n]存动物B,f[2n+1~3n]存动物C
int find_(int x)//并查集找祖先函数
{
    if(f[x]==x) return x;//找到了祖先就返回祖先是哪一个
    return f[x]=find_(f[x]);//路径压缩+查找
}
void merge_(int x,int y)//并查集合并函数
{
    int t1=find_(x),t2=find_(y);//找各自的祖先
    if(t1!=t2) f[t2]=t1;//如果不在同一个集合内就合并
    return;//结束
}
int main()
{
    int n=0,k=0,ans=0;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n*3;i++) f[i]=i;//并查集初始化
    for(int i=1;i<=k;i++)
    {
        int s=0,x=0,y=0;
        scanf("%d%d%d",&s,&x,&y);
        if(x>n||y>n||s==2&&x==y) ans++;//判断属于第2、3种情况的假话
        else
            if(s==1)//如果此句话说的是x和y为同类
                //如果前面的话中已经出现x吃y或y吃x的情况,就说明它们不是同类且这一句话是假话
                if(find_(x)==find_(y+n)||find_(y)==find_(x+n)) ans++;
                else//否则就说明这一句话是真的
                {
                    //考虑3种情况
                    merge_(x,y);//若它们均为动物A,则合并x,y
                    merge_(x+n,y+n);//若它们均为动物B,则合并x+n,y+n
                    merge_(x+n*2,y+n*2);//若它们均为动物B,则合并x+n*2,y+n*2
                }
            else//如果此句话说的是x吃y
                //如果前面的话中已经出现x与y是同类或y吃x的情况,就说明x不吃y且这一句话是假话
                if(find_(x)==find_(y)||find_(y)==find_(x+n)) ans++;
                else//否则就说明这一句话是真的
                {
                    //考虑3种情况
                    merge_(x,y+n);//若x为A且y为B,将y+n合并到x下,表示x吃y+n
                    merge_(x+n,y+n*2);//若x为B且y为C,将y+n*2合并到x+n下,表示x+n吃y+n*2
                    merge_(x+n*2,y);//若x为C且y为A,将y合并到x+n*2下,表示x+n*2吃y
                }
    }
    printf("%d",ans);//输出
    return 0;
}

原文地址:https://www.cnblogs.com/wozaixuexi/p/8453554.html

时间: 2024-10-11 15:53:54

做题记录:P2024 食物链(洛谷)的相关文章

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

project euler做题记录

ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{array}{c} S(n) & = & \sum_{i = 1} ^ n \sum_{p = 1} ^ i \sum_{q = p + 1} ^ i \frac {1}{pq}[p + q \geq i][gcd(p, q) = 1] \& = & \sum_{i = 1} ^

退役前的做题记录5.0

退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径.对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可. [Wannafly挑战赛4F]线路规划 类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置

清华集训2014 做题记录

清华集训2014做题记录 已完成 [清华集训2014]玛里苟斯 [清华集训2014]主旋律 [清华集训2014]奇数国 [清华集训2014]矩阵变换 [清华集训2014]sum [清华集训2014]虫逢 [清华集训2014]玄学 [清华集训2014]文学 未完成 [清华集训2014]卡常数 [清华集训2014]简单回路 [清华集训2014]Router [清华集训2014] Breaking Bomber 写一题要膜一题题解,膜完题解膜代码,膜完代码膜指导,膜了好几天了还有四个题没做. [清华集

2020年3月做题记录

[不定时更新,赶论文,赶项目,1月~2月做题记录还在整理,自我训练] 反转链表 链接:https://leetcode-cn.com/problems/reverse-linked-list/ 类名: 考察点:链表.迭代.递归 解题过程: 力扣3月每日1题,题解链接: https://leetcode-cn.com/problems/reverse-linked-list/solution/di-2ci-da-qia-lian-biao-fan-zhuan-di-gui-by-wu-xi-/ 就

2019-9-11做题记录

1.[luogu4921]情侣,给我烧了: 我们这里只讨论直接算代替容斥的做法. $n$个情侣,恰好有$k$个不和谐,枚举是哪$k$个,$C_n^k$.坐在哪些位置上,$C_n^k$.确定先后关系(为下面算$f$埋下伏笔),$2^n$.确定顺序,$k! (n-k)!$. 剩下还要求$i$对情侣,已经指定了顺序,和彼此先后关系,求任意一对都不坐在一排上的方案数.也就是说对于任意一种方案,我们都可以唯一确定它的顺序和彼此的先后关系,因为我已经乘过了.考虑顺序和彼此先后关系怎么体现:也就是说,对于“$

Educational Codeforces Round 79做题记录

这套题感觉出的不咋滴,第四题和第五题难度差了1000分!!! 前四题都还简单,第五题就31人做出……我算了…… 懒得写题解了,做个记录吧(这就是偷懒的理由???) 比赛传送门 A.New Year Garland 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #define re

2020年3月底到4月第1周做题记录(力扣)

写在前面的话: 多看书,整完论文,deadline驱动,加油. 做题时间: 2020年3月30日~2020年4月5日 记录: 总共道题,时间为min. 最近更新时间: 202003230 圆圈中最后剩下的数字 链接: https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/ 类名: 考察点: 环.模拟 解题过程:力扣3月每日1题 题目的意思是用n个数字形成一个圆圈,数字范围为0到n-1,数