题解 [NOI2015]程序自动分析
据说考前写题解可以$\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]程序自动分析的更多相关文章
- codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析
4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在实现 ...
- 【BZOJ4195】[Noi2015]程序自动分析 并查集
[BZOJ4195][Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3 ...
- bzoj 4195: [Noi2015]程序自动分析
4195: [Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表 ...
- [UOJ#127][BZOJ4195][NOI2015]程序自动分析
[UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...
- Codevs 4600 [NOI2015]程序自动分析
4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...
- BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)
4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 689 Solved: 296 [Submit][Sta ...
- BZOJ4195 NOI2015 程序自动分析
4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Description 在实现程序自动分析的过程中,常常需要判定一些约束条件 ...
- [NOI2015]程序自动分析(并查集,离散化)
[NOI2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的 ...
- 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...
随机推荐
- 2020/7/6博客日报Java的开始--pthread的安装
1.今天进行了Java环境的安装,安装eclipse之后学习了eclipse的使用方法,如何建立项目,并完成了最基本的Java hello的运行: 今天是Java的开端,开始进入Java编程: 今天了 ...
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑
(1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...
- 重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 黎明前的坚守,的住吗? 有人举过这样一个例子,先给你张北大的录 ...
- HBuilder生成证书
一.安装jdk https://www.oracle.com/java/technologies/javase-downloads.html 二.打开CMD命令到JDK安装目录bin文件夹下 执行命令 ...
- 数据可视化之powerBI基础(十四)Power BI中创建联动切片器
https://zhuanlan.zhihu.com/p/67564062 进行数据分析时,每个分析维度并不总是独立的,比如省份是一个维度,城市也是一个维度,而这两个维度之间是有逻辑关系的,那么在进行 ...
- C++中类继承public,protected和private关键字作用详解及派生类的访问权限
注意:本文有时候会用Visual Studio Code里插件的自动补全功能来展示访问权限的范围(当且仅当自动补全范围等价于对象访问权限范围的时候),但是不代表只要是出现在自动补全范围内的可调用对象/ ...
- nodejs之数据库连接
nodejs 对 MySQL.mongodb.redis 数据库的连接方式. MySQL: var mysql = require('mysql') var { MYSQL } = require(' ...
- django-rest-framework-源码解析002-序列化/请求模块/响应模块/异常处理模块/渲染模块/十大接口
简介 当我们使用django-rest-framework框架时, 项目必定是前后端分离的, 那么前后端进行数据交互时, 常见的数据类型就是xml和json(现在主流的是json), 这里就需要我们d ...
- 关于简单的数据双向绑定原理,defineProperty 和Proxy演示
双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行. 在这个例子中,我们使用defineProperty ,Object.define ...
- 前端学习(三):body标签(一)
进击のpython ***** 前端学习--body标签 body中的相关标签,因为是主要展现在页面的内容区域 所以相对来说内容多,杂,要背记的部分很多 当学完这节的内容之后,你可以试着写一片精致的文 ...