当前位置: 首页 > news >正文

洛谷 P2024 拓展域并查集

题目在这里

题意

动物王国中有三类动物 \(A,B,C\),这三类动物的食物链构成了有趣的环形。\(A\)\(B\)\(B\)\(C\)\(C\)\(A\)

现有 \(N\) 个动物,以 \(1 \sim N\) 编号。每个动物都是 \(A,B,C\) 中的一种,但是我们并不知道它到底是哪一种。

有人用两种说法对这 \(N\) 个动物所构成的食物链关系进行描述:

  • 第一种说法是 \(1\) \(X\) \(Y\),表示 \(X\)\(Y\) 是同类。
  • 第二种说法是 \(2\) \(X\) \(Y\),表示 \(X\)\(Y\)

此人对 \(N\) 个动物,用上述两种说法,一句接一句地说出 \(K\) 句话,这 \(K\) 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

  • 当前的话与前面的某些真的话冲突,就是假话;
  • 当前的话中 \(X\)\(Y\)\(N\) 大,就是假话;
  • 当前的话表示 \(X\)\(X\),就是假话。

你的任务是根据给定的 \(N\)\(K\) 句话,输出假话的总数。

分析

用拓展域并查集, \([i,n]\)表示同类, \([i+n, 2 * n]\) 表示猎物, \([i + 2 * n, i + 3 * n]\) 表示天敌
猎物的猎物是天敌,天敌的天敌是猎物

  • 对于查询\(1\)如果 \(X\) \(Y\) 互吃则为假
  • 对于查询\(2\)如果 \(X\) \(Y\) 是同类或 \(Y\)\(X\) 则为假

代码

点击查看代码
#include <bits/stdc++.h>using namespace std;
const int MAXN = 200010;
int n, k, fa[MAXN], ans = 0;
// i~n 同类, i + n ~ 2 * n 猎物, i + 2 * n ~ i + 3 * n 天敌 
int find(int x)
{if(fa[x] == x) return x;return fa[x] = find(fa[x]);
}int main()
{ios::sync_with_stdio(0), cin.tie(0);cin >> n >> k;for(int i = 1; i <= 3 * n; i++) fa[i] = i;for(int i = 0; i < k; i++){int op, x, y;cin >> op >> x >> y;if(x > n || y > n) ans++;else if(op == 1){// 如果x, y不互吃 if(find(x) != find(y + n) && find(x) != find(y + 2 * n) && find(x + n) != find(y) && find(x + 2 * n) != find(y)) {fa[find(y)] = find(x); // x 与 y 合并 fa[find(y + n)] = find(x + n); // x的猎物与y的猎物合并 fa[find(y + 2 * n)] = find(x + 2 * n); // y的天敌与x的天敌合并 }else ans++;}else if(op == 2){// 如果 y 吃 x if(find(x) == find(y) || find(x) == find(y + n) ||find(x + 2 * n) == find(y)) ans++;else {fa[find(y + 2 * n)] = find(x); // y 的天敌与 x合并 fa[find(x + n)] = find(y); // x 的猎物与 y合并 fa[find(x + 2 * n)] = find(y + n); // x的天敌与 y的猎物合并 }}}printf("%d", ans);return 0;
}
http://www.sczhlp.com/news/3430/

相关文章:

  • 基于 Rust 和土木工程、设备故障诊断、混凝土养护、GPS追踪、供应链物流跟踪系统、地下水监测等领域的实例 - 详解
  • 1.3 操作系统
  • AI HR重磅奖项发布!易路接连斩获思旗奖及人力资源AI企业25强
  • [COCI 2023/2024 #2] Dizalo
  • 表级锁-间隙锁/临键锁 - Charlie
  • 8月1日总结
  • Nuxt3项目中引用nuxt-swiper时,slideTo方法失效?
  • C语言中死锁的产生原因及预防
  • 英语背单词 专八词汇 中英对照 2025年08月
  • [特殊字符] 数字孪生 + 数据可视化:实战经验分享,让物理世界素材 “会说话”
  • 对象存储 RustFS 用户的删除和创建
  • JavaScript
  • cs106l assignment 2025spring
  • CodeGeeX体验GLM4.5模型与实践
  • 【自学嵌入式:51单片机】用UART串口通信和矩阵按键实现快速打开win系统中的一些程序
  • CEC协议_1_cecMsg数据帧是如何定义的?
  • Doris 性能优化
  • 惊艳!GitHub 开发者一键接入!4.2k star 项目 Champ,用一张照片秒变动画
  • CH395调试与使用
  • 免费,Qwen3-Coder不限量!
  • ModelGate 支持 Claude Code,一键设置 A编程助手,开发效率极速提升!
  • iOS 加固工具实战解析,主流平台审核机制与工具应对策略
  • 提升SketchUp建模效率!智达云v1.1.26插件图文安装教程
  • 【vibe coding】AI IDE配置(更新中)
  • Minikube 本地部署 Jupyter 集群
  • AMIS:百度开源的前端低代码神器,18.4k star 背后的开发效率提升利器
  • Codes项目管理软件:凭什么重新定义 SaaS?
  • 提升设计效率!Ropefall v1.02插件完美适配SketchUp 2016-2025
  • debain设置 iptables 端口转发
  • 一套视频快速入门并精通PostgreSQL