《洛谷深入浅出进阶篇》P1995 程序自动分析——并查集,离散化

上链接:P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1955

上题干:

首先给你一个整数t,代表t次操作。

每一次操作包含以下内容:

1.给你一个整数n,让你执行n次条件

接下来n行,每行给你3个整数i,j,k,

例如 1 2 1

或  1 2 0

(前面两个数代表下标,第三个整数k代表条件,如果它是1 ,则代表 x1 = x2,如果它是0,代表x1!=x2) 

然后我们每一次操作需要输出yes 或 no 来表示这n个条件是否全部成立。

(假如给出这样的数据:

    n=4

    1 2 1

    2 3 1

    1 4 1

    3 4 0

    第一个条件到第四个条件分别是 x1=x2,x2=x3,x1=x4 ,x3!=x4

由于前面三个条件我们可以得知  x1=x2=x3=x4   所以与x3!=x4矛盾,输出no)

数据 n<=1e6, i,j<=1e9

很显然,这道题的条件和数据范围告诉我们:需要用到并查集+(离散化 or hash表)

第一,并差集的特点就是能将不同的集合连接到一起,然后便于我们查询某两个元素是否为同一集合。

第二,这道题的数据范围太大了,i能达到ie9,所以我们直接用并查集的话,毫无疑问,数组装不下。所以我们可以用离散化来大大缩小数据范围,除此之外呢,我们还可以用hash表来处理这样的大数据,使得每一个大数据都有一个特别的标记与之对应。

这两种方法都满足我们的需求,这里主要用离散化来实现代码。

还记得离散化的具体步骤吗?

记录散点,排序,去重,二分查找

并查集的具体步骤呢?

初始化集合,建立查询函数,合并函数。

所以我们的思路是这样的:

1,先将每一次的散点都存入一个数组b中

2,对这个数组b进行排序

3,对这个数组进行去重(可以选择重新建立一个数组c来存放去重后的数据,也可以直接用unique函数。)

4,二分查找每一对散点的相对位置。

5,初始化并查集

6,如果第三个数字k=1,我们就利用并查集来合并两个集合。

7,如果第三个数字k=0,我们就查询两个数是否为同一集合,如果是同一集合,那么我们有

上代码:


const int MAXN = 1e6 + 10;
struct st {int x, y, z;
};
st a[MAXN];//三组输入数据存放之处
int b[2 * MAXN];// 存入散点
int c[2 * MAXN];//排序数组
int fa[2 * MAXN];//并查集
int btop, ctop;int find1(int x)
{if (x == fa[x])return fa[x];return fa[x] = find1(fa[x]);
}
void join1(int c1, int c2)
{int f1 = find1(c1), f2 = find1(c2);if (f1 != f2)fa[f1] = f2;
}
int main()
{int t;cin >> t;while (t--){btop = 0;ctop = 0;int n;cin >> n;for (int i = 1; i <= n; i++){cin >> a[i].x >> a[i].y >> a[i].z;b[++btop] = a[i].x;b[++btop] = a[i].y;}sort(b + 1, b + 1 + btop);for (int i = 1; i <= btop; i++)if (i == 1 or b[i] != b[i - 1])c[++ctop] = b[i];for (int i = 1; i <= n; i++){a[i].x = lower_bound(c + 1, c + 1 + ctop, a[i].x) - c;a[i].y = lower_bound(c + 1, c + 1 + ctop, a[i].y) - c;}for (int i = 1; i <= ctop; i++){fa[i] = i;}for (int i = 1; i <= n; i++){if(a[i].z)join1(a[i].x, a[i].y);}bool fk = 1;for (int i = 1; i <= n; i++){if (a[i].z==0){if (find1(a[i].x) == find1(a[i].y))fk = 0;}}if (fk == 0)cout << "NO" << endl;else cout << "YES" << endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习c#的第十八天

目录 C# 文件的输入与输出 C# I/O 类 FileStream 类 文本文件的读写 StreamReader 类 StreamWriter 类 实例 二进制文件的读写 BinaryReader 类 BinaryWriter 类 实例 Windows 文件系统的操作 DirectoryInfo 类 FileInfo 类 实例 C# 文件的输入与输出 一个 文件…

【机器学习13】生成对抗网络

1 GANs的基本思想和训练过程 生成器用于合成“假”样本&#xff0c; 判别器用于判断输入的样本是真实的还是合成的。 生成器从先验分布中采得随机信号&#xff0c;经过神经网络的变换&#xff0c; 得到模拟样本&#xff1b; 判别器既接收来自生成器的模拟样本&#xff0c; 也接…

数据结构:红黑树讲解(C++)

红黑树 1.前言2.红黑树简述2.1概念2.2性质 3.红黑树的插入3.1关于新插入节点的颜色3.2节点的定义3.3插入新节点3.4判断插入后是否需要调整3.5插入后维持红黑树结构&#xff08;重点&#xff09;3.5.1cur、p、u为红&#xff0c;g为黑3.5.2cur、p为红&#xff0c;g为黑&#xff0…

【【VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 】】

VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 LCD 的构造是在两片平行的玻璃基板当中放置液晶盒&#xff0c;下基板玻璃上设置 TFT&#xff08;薄膜晶体管&#xff09;&#xff0c;上基板玻璃上设置彩色滤光片&#xff0c;通…

Flutter 应用启动从闪屏页短暂黑屏再到第一个页面

由于应用初始状态启动会有白屏现象&#xff0c;便使用 flutter_native_splash 2.3.5 插件生成了启动相关的配置&#xff0c;并且按照示例使用了 import package:flutter_native_splash/flutter_native_splash.dart;void main() {WidgetsBinding widgetsBinding WidgetsFlutte…

如何进行跨平台开发和移植性处理?

跨平台开发和移植性设计是在不同操作系统和硬件平台上开发软件的关键考虑因素。这通常涉及使用如C或C这样的通用编程语言&#xff0c;以及利用跨平台库和工具来处理平台特定的差异。 在具体实施时&#xff0c;需要考虑以下几点&#xff1a; 代码的可移植性&#xff1a;编写代码…

牛客 —— 链表中倒数第k个结点(C语言,快慢指针,配图)

目录 1. 思路1&#xff1a;倒数第K个节点&#xff0c;就是整数第N-K1的节点 2. 思路2&#xff1a;快慢指针 1. 思路1&#xff1a;倒数第K个节点&#xff0c;就是整数第N-K1的节点 链表中&#xff0c;一共有N个节点&#xff0c;如果我们想要得出倒数第K个节点&#xff0c;我们…

图像倾斜角度求取-Radon变换

Radon算法 Radon&#xff08;拉东&#xff09;算法是一种通过定方向投影叠加&#xff0c;找到最大投影值时角度&#xff0c;从而确定图像倾斜角度的算法。具体过程如图所示 图1 Radon变换算法 Radon计算示例 对于纹理方向明显的图像&#xff0c;如图2所示&#xff0c;可以通…

【设计模式】聊聊模板模式

原理和实现 设计模式的原理和实现是比较简单的&#xff0c;难的是掌握具体的应用场景和解决什么问题。而模板模式是为来解决复用和拓展两个问题。 模板模式在一个方法中定义好一个算法框架&#xff0c;然后将某些步骤推迟到子类中实现&#xff0c;子类可以在不修改父类流程的时…

qsort使用举例和qsort函数的模拟实现

qsort使用举例 qsort是C语言中的一个标准库函数&#xff0c;用于对数组或者其他数据结构中的元素进行排序。它的原型如下&#xff1a; void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 我们可以去官网搜来看一看&#xff1a;…

golang学习笔记——生成随机整数的函数Int31n

介绍 rand.31n()函数是Golang标准库中用来生成介于0到n之间的随机整数的函数。其中n是指定的范围&#xff0c;可以是任意正整数。该函数的具体实现方式是在go语言内部使用C语言的随机数生成函数来生成随机数。 具体来说&#xff0c;rand.Int31n()函数的参数n表示要生成的随机…

Ubuntu20.04安装Beyond Compare 4.4.7

参考链接&#xff1a; 1.Ubuntu20.04 Beyond Compare 4.3.7 安装 2.Ubuntu20.04安装Beyond Compare 4.3.7

MySQL 定时计划任务 事件的使用

目录 查看事件是否开启 开启事件 1&#xff09;通过设置全局参数修改 2&#xff09;更改配置文件 MySQL如何创建并执行事件&#xff1f; 例 1 MySQL查看事件状态信息 MySQL修改和删除事件 例 1 例 2 删除事件 例 3 在数据库管理中&#xff0c;经常要周期性的执行某…

lxml基本使用

lxml是python的一个解析库&#xff0c;支持HTML和XML的解析&#xff0c;支持XPath解析方式&#xff0c;而且解析效率非常高 XPath&#xff0c;全称XML Path Language&#xff0c;即XML路径语言&#xff0c;它是一门在XML文档中查找信息的语言&#xff0c;它最初是用来搜寻XML文…

【C/PTA】数组进阶练习(二)

本文结合PTA专项练习带领读者掌握数组&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 字符串逆序7-2 字符串替换7-3 统计字符出现次数7-4 IP地址转换7-1 删除重复字符7-2 说反话-加强版7-3 数组-回文串7-4 数组-无聊的菇菇…

2024全网最新最全的Pytest接口自动化测试框架教程

pytest编写的规则&#xff1a; 1、测试文件以test_开头&#xff08;以_test结尾也可以&#xff09; 2、测试类以Test开头&#xff0c;并且不能带有__init__方法 3、测试函数以test_开头 4、断言必须使用assert pytest.main([-s,-v]) &#xff1a;用来执行测试用例 -s 打印prin…

卷积神经网络(CNN)天气识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集 三、构建CNN网络四、编译五、训练模型六、模型评估 前期工作 1. 设置GP…

11.10 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招丨海康机器人2024校招3大类岗位补录&#xff08;内推&#xff09; 校招丨海康机器人2024校招3大类岗位补录&#xff08;内推&#xff09; 2、校招&实习 | 华为数据存储研究部招聘…

SELinux零知识学习十九、SELinux策略语言之类型强制(4)

接前一篇文章&#xff1a;SELinux零知识学习十八、SELinux策略语言之类型强制&#xff08;3&#xff09; 二、SELinux策略语言之类型强制 2. 类型、属性和别名 &#xff08;4&#xff09;别名 别名是引用类型时的一个备选的名字&#xff0c;能够使用类型名的地方就可以使用别…

EEPROM与Flash的区别

EEPROM与Flash的区别 EEPROMEEPROM内部功能框图实现写入数据内部结构存储管在充电或放电状态下有着不同的阈值电压 问题点EEPROM是如何失效的呢&#xff1f;为何EEPROM不能做大呢&#xff1f; ------------------------------------------------------------------------------…