据说考前写题解可以$\text{RP}$++?

这题还是算一道并查集水题了吧qwq我又做了好久

--------------------------------------------------------

题目描述

在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。

考虑一个约束满足问题的简化版本:假设$x_1$,$x_2$,$x_3$...代表程序中出现的变量,给定$\text{n}$个形如$x_i=x_j$或$x_i≠x_j$的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:$x_1=x_2$,$x_2=x_3$,$x_3=x_4$,$x_4≠x_1$,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。

现在给出一些约束满足问题,请分别对它们进行判定。

输入格式

输入文件的第$1$行包含$1$个正整数$\text{t}$,表示需要判定的问题个数。注意这些问题之间是相互独立的。

对于每个问题,包含若干行:

第$1$行包含$1$个正整数$\text{n}$,表示该问题中需要被满足的约束条件个数。接下来$\text{n}$行,每行包括$3$个整数$\text{i,j,e}$,描述$1$个相等/不等的约束条件,相邻整数之间用单个空格隔开。若$\text{e=1}$,则该约束条件为$x_i=x_j$;若$\text{e=0}$,则该约束条件为$x_i≠x_j$;

输出格式

输出文件包括$\text{t}$行。

输出文件的第 $\text{k}$行输出一个字符串“$\text{YES}$” 或者“$\text{NO}$”(不包含引号,字母全部大写),“$\text{YES}$” 表示输入中的第$\text{k}$个问题判定为可以被满足,“$\text{NO}$” 表示不可被满足。

------------------------------------------------------------

题目要求判断多个等式和不等式是否矛盾。

由于多个等式具有传递性,所以会想到用并查集来维护变量之间的关系。

如果当前数据无解,那么显然是出现了多个等式间接满足$\text{x=y}$,但是题目中又出现$\text{x≠y}$的条件。

所以,对于每一组$\text{x=y}$的约束条件,合并这两个元素,代表这两个元素满足相等关系。

如果出现$\text{x≠y}$的约束条件,检查这两个元素是否在并查集中,如果是,就输出无解;否则继续判断,直到判断完所有的条件。

中间过程有一些细节处理需要注意一下:(也是自己遇到的问题,当然这里有可能是我没有想到用什么更好的办法去处理)

$\text{1.}$ 题目数据范围中的$\text{i,j}$很大,数组肯定装不下,所以可以离散化处理;

$\text{2.}$ 我们的程序中,如果有两个条件互相约束且满足一定的顺序(比如说第一行$\text{x=y}$,第二行$\text{x≠y}$),那么我们的程序还可以正常输出;但是如果将这两行交换一下输入顺序,程序就会输出错误的答案。一开始我想的是另外一个并查集来维护不等式之间的关系,但是后来发现不等式没有传递性...所以我们可以考虑优先处理变量相等的关系,然后再来处理变量不相等的关系,这样就可以保证查询不相等变量是否连通时不会受到后面关系的影响。

概括一下就是:要优先处理相等变量之间的关系,保证不会影响后面不相等变量之间的关系。

$\text{3.}$ 由于有$\text{n}$对关系,每对关系又有$\text{2}$个变量,所以并查集数组的大小一定要开两倍!

上代码~

#include <cstdio>
#include <algorithm> using namespace std; const int N = 1e6 + 5; int t, n, tot, cnt;
int fa[N << 1], a[N << 1], temp[N << 1]; struct node {
int x, y;
bool z;
} ask[N];//存储查询 inline int get (int x) {
if (x == fa[x]) return x;
return fa[x] = get(fa[x]);
} inline void merge (int x, int y) {
fa[get(x)] = get(y);
} inline bool tmp (node g, node h) {
return g.z > h.z;
} inline void solve () {
scanf("%d", &n);
tot = cnt = 0;
for (int i = 1; i <= n * 2; i++) fa[i] = i;//数组大小一定要开两倍啊
for (int i = 1; i <= n; i++) {
scanf("%d%d%d", &ask[i].x, &ask[i].y, &ask[i].z);
temp[++tot] = ask[i].x;
temp[++tot] = ask[i].y;
}
sort(temp + 1, temp + tot + 1);
sort(ask + 1, ask + n + 1, tmp);//对查询排序,保证优先处理相等变量之间的关系
a[++cnt] = temp[1];
for (int i = 2; i <= tot; i++) {
if (temp[i] != temp[i - 1]) a[++cnt] = temp[i];
}//离散化输入的变量
for (int i = 1; i <= n; i++) {
int xx = lower_bound(a + 1, a + cnt + 1, ask[i].x) - a;
int yy = lower_bound(a + 1, a + cnt + 1, ask[i].y) - a;
if (ask[i].z) merge(xx, yy);
else {
if (get(xx) == get(yy)) {
printf("NO\n");
return;
}//如果前面满足相等关系但是这里又满足不等关系,无解
}
}
printf("YES\n");
} int main () {
scanf("%d", &t);
while (t--) solve();
return 0;
}

题解 [NOI2015]程序自动分析的更多相关文章

  1. codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析

    4600 [NOI2015]程序自动分析  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在实现 ...

  2. 【BZOJ4195】[Noi2015]程序自动分析 并查集

    [BZOJ4195][Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3 ...

  3. bzoj 4195: [Noi2015]程序自动分析

    4195: [Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表 ...

  4. [UOJ#127][BZOJ4195][NOI2015]程序自动分析

    [UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...

  5. Codevs 4600 [NOI2015]程序自动分析

    4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...

  6. BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 689  Solved: 296 [Submit][Sta ...

  7. BZOJ4195 NOI2015 程序自动分析

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Description 在实现程序自动分析的过程中,常常需要判定一些约束条件 ...

  8. [NOI2015]程序自动分析(并查集,离散化)

    [NOI2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的 ...

  9. 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...

随机推荐

  1. 洛谷P3237 [HNOI2014]米特运输

    题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个 ...

  2. Python爬虫教程(16行代码爬百度)

    最近在学习python,不过有一个正则表达式一直搞不懂,自己直接使用最笨的方法写出了一个百度爬虫,只有短短16行代码.首先安装必背包: pip3 install bs4 pip3 install re ...

  3. 解决alert在ios版微信中显示url的问题(重写alert)

    为了解决alert在ios版微信中显示url的问题 window.alert = function(name){ var iframe = document.createElement("I ...

  4. Scala 面向对象(十二):嵌套类

    在Scala中,你几乎可以在任何语法结构中内嵌任何语法结构.如在类中可以再定义一个类,这样的类是嵌套类,其他语法结构也是一样. 嵌套类类似于Java中的内部类. Scala嵌套类的使用1 请编写程序, ...

  5. JVM 专题十二:运行时数据区(七)对象的实例化内存布局与访问定位

    1. 对象的实例化 1.1 创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance() ...

  6. 句柄Handle的释放(8)

    本篇首先介绍几个与句柄分配与释放密切相关的类,然后重点介绍句柄的释放. 1.HandleArea.Area与Chunk 句柄都是在HandleArea中分配并存储的,类的定义如下: // Thread ...

  7. Python 爬取 42 年高考数据,告诉你高考为什么这么难?

    作者 | 徐麟 历年录取率 可能很多经历过高考的人都不知道高考的全称,高考实际上是普通高等学校招生全国统一考试的简称.从1977年国家恢复高考制度至今,高考经历了许多的改革,其中最为显著的变化就是录取 ...

  8. Python Ethical Hacking - BACKDOORS(2)

    Refactoring - Creating a Listener Class #!/usr/bin/env python import socket class Listener: def __in ...

  9. 【软件安装】在 CentOS 7(Linux)上部署流媒体服务(Tengine、ffmpeg、Centos 7、nginx-http-flv-module、OBS)

    Centos7+Tengine+Nginx-http-flv-module+ffmpeg+OBS搭建流媒体服务器 一.需求和背景 视频直播是基于领先的内容接入.分发网络和大规模分布式实时转码技术打造的 ...

  10. Markdown 教程之编辑器

    1. Typora 编辑器 Typora 是一款支持实时预览的 Markdown 文本编辑器.它有 OS X.Windows.Linux 三个平台的版本,并且由于仍在测试中,是完全免费的. 2. 安装 ...