传送门啦

这道题的特殊之处在于对于任意一个并查集,只要告诉你某个节点的物种,你就可以知道所有节点对应的物种。

比如一条长为4的链 甲->乙->丙->丁 ,我们知道乙是A物种。那么甲一定是B物种,因为A只吃B物种,不吃C物种或是自己的同类。同样的丙一定是C物种,丁是B物种。

也就是说,每一条链上都是A、B、C物种循环,这也是我们寻找不合逻辑的假话的出发点。

我们可以定义数组 $ dis[i] $ 表示节点i到根节点距离 $ mod3 $ 的结果帮助解题。

我们统计谎话的数量,那么我们把谎话这样分类:

第一类谎话,包括

(1)自己吃自己的同类是谎话,表述为 $ flag2 , xy $

(2)编号超出限制,表述为 $ x>n||y>n $ 。 第二类叫不弱智的谎话,包括 $ flag1 , flag2 $ 这样两类。

(1)d==1。

我们先要考虑x y是否在同一个并查集中,这是判断真假话的前提。

如果 $ x y $ 不在同一个并查集中,那么关于他们的任何表述都可以是真的。

如果我说1和6是同类,那么自然地,2与7,3与8,4与9成为同类。

我们任意的选取两个数是同类都是符合的。

下面我们要做的就是把两个并查集合并。

$ d[f[x]]=(d[y]-d[x]+3)%3 $ ;//关于距离

$ fa[fa[x]]=fa [y] $ ;//关于父亲

如果x y在同一个并查集中,那么违反距离关系的话一定是假话。

$ dis[x]!=dis[y] $ //关于距离

(2) $ flag==2 $ 。

还是先看x y是否在一个并查集中,如果不在,那么合并并查集;如果在,那么根据距离关系找出假话。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define re register
using namespace std;
const int maxn = 5 * 1e4; inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0') {if(ch == '-') f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0' ;ch = getchar();}
return x * f;
} int n,k,flag,x,y;
int fa[maxn],dis[maxn],ans; inline void init(){
for(re int i = 1 ; i <= n ; ++i)
fa[i] = i;
} inline int find(int x){
if(x != fa[x]) {
int father = fa[x] ;
fa[x] = find(fa[x]) ;
dis[x] = (dis[x] + dis[father]) % 3 ;
}
return fa[x];
} int main(){
n = read(); k = read();
init();
for(re int i = 1 ; i <= k ; ++i) {
flag = read(); x = read(); y = read();
if(flag == 2 && x == y) {
ans++;
continue;
}
if(x > n || y > n) {
ans++;
continue;
}
if(flag == 1) {
if(find(x) == find(y)) {
if(dis[x] != dis[y])
ans++;
}
else {
dis[fa[x]] = (dis[y] - dis[x] + 3) % 3;
fa[fa[x]] = fa[y];
}
}
else {
if(find(x) == find(y)) {
if(dis[x] != (dis[y] + 1) % 3)
ans++;
}
else {
dis[fa[x]] = (dis[y] - dis[x] + 4) % 3 ;
fa[fa[x]] = fa[y];
}
}
}
printf("%d\n",ans);
return 0;
}

洛谷P2024食物链的更多相关文章

  1. 洛谷P2024 食物链

    挺神奇 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种 ...

  2. 洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  3. 种类并查集(洛谷P2024食物链)

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  4. 洛谷P2024食物链——并查集补集的灵活运用

    题目:https://www.luogu.org/problemnew/show/P2024 自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变. 借鉴题解后,才明 ...

  5. 洛谷 [P2024] 食物链

    并查集 这是一道比较特殊的并查集,开一个三倍的数组, 1-n保存同类,n-n×2保存猎物,n2~n3保存天敌: #include <iostream> #include <cstdi ...

  6. 洛谷P2024 食物链 [NOI2001] 并查集

    正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...

  7. 洛谷 P2024 [NOI2001]食物链 解题报告

    P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...

  8. 洛谷 P2024 [NOI2001]食物链 (并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...

  9. [洛谷P2024/POJ1182]食物链 - 带偏移量的并查集(2)

    Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的 ...

随机推荐

  1. Android Progurad 代码混淆

    ref: ProGuard基础语法和打包配置.mdhttps://github.com/D-clock/Doc/blob/master/Android/Gradle/3_ProGuard%E5%9F% ...

  2. CentOS 6.6搭建LNMP环境

    一.安装前 1.关闭linux的安全机制 vim /etc/selinux/config SELINUX=enforcing  改为  SELINUX=disabled 2.关闭iptables防火墙 ...

  3. C++实现两个大整数的相加(考虑到负数异常情况)

    实现两个大整数的相加,首先应该排除直接使用int和long long的方法,这些方法很容易溢出,这里为了方便(是否可以使用更精简的结构存储?)采用char来存储整数,整体思路如下: 1. 对于整数n和 ...

  4. Codeforces 804D Expected diameter of a tree

    D. Expected diameter of a tree time limit per test 3 seconds memory limit per test 256 megabytes inp ...

  5. python实现将IP地址转换为数字

    话不多说,直接代码 ip_addr='192.168.2.10' # transfer ip to int def ip2long(ip): ip_list=ip.split('.') result= ...

  6. 「Vue」程序式路由导航用法

    1.button发起点击请求<mt-button type='primary' size='large' plain @click="topdcmt(id)">商品评论 ...

  7. mysql 对应 binlog 查看

    什么是 binlog binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格 ...

  8. [Web] Web请求过程之一:HTTP

    请求过程: 1.用户在浏览器输入 www.sdjtu.edu.cn 这个URL. 2.浏览器请求 DNS 服务器将这个 URL 解析成对应的 IP 地址. 3.浏览器向 IP 地址对应的这个服务器发起 ...

  9. Git之原有基础开发新功能

    场景描述 当一个项目已经上线,同时又在原有基础上新增功能模块,于是乎就要在原有代码的基础上进行开发,在新增模块功能的开发的过程中,项目发现了一个紧急Bug,需要修复.操作流程如下:

  10. Java并发编程原理与实战六:主线程等待子线程解决方案

    本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...