题解 [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的变量 ...
随机推荐
- REST,RPC和GraphQL应用场景,WebHooks、WebSocket、HTTP Streaming应用场景。
一.请求--响应API. 请求--响应类的API的典型做法是,通过基于HTTP的Web服务器暴露一个/套接口.API定义一些端点,客户端发送数据的请求到这些端点,Web服务器处理这些请求,然后返回响应 ...
- 数据可视化之 图表篇(四) 那些精美的Power BI可视化图表
之前使用自定义图表,每次新打开一个新文件时,都需要重新添加,无法保存,在PowerBI 6月更新中,这个功能得到了很大改善,可以将自定义的图表固定在内置图表面板上了. 添加自定义图表后,右键>固 ...
- Java 分布式任务调度平台:PowerJob 快速开始+配置详解
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 引言 HelloGitHub 推出的<讲解开源项目>系列. 项目地址: https://github.c ...
- day7 python字符串的操作及方法
1.字符串 1.1 字符串的操作 # 1.字符串的拼接 strvar = "我爱" + "中国" # 2.字符串的重复 strvar = "今天下午2 ...
- 什么是控制反转(IoC)?什么是依赖注入(DI)?以及实现原理
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试:有了 ...
- three.js 绘制3d地图
通过地图数据配合three可以做出非常酷炫的地图,在大数据展示中十分常见. 这篇郭先生就来说说使用three.js几何体制作3D地图.在线案例点击原文地址. 地图的数据是各个地图块的点数组,通过THR ...
- oracle数据库查询分组之外的数据方法
select * from (select t.*,row_number() over(partition by 分组字段 order by rownum) rn from 表名 t where 条件 ...
- Ethical Hacking - NETWORK PENETRATION TESTING(2)
ALFA AWUS 1900 RTL8814AU https://www.alfa.com.tw/products_detail/2.htm Follow the guide on aircrac ...
- 实践使用nodejs获取用户真实IP?
先上代码 var http = require('http') var server = http.createServer(function (req,res) { console.log(req. ...
- oracle 在物理机上添加磁盘操作
物理机上添加磁盘操作 注意:1)物理机上添加磁盘操作,不涉及到start_udev的动作.2)磁盘分区的操作,需要谨慎进行,核准无误后再操作. (1)查看磁盘名称命名 # su - grid$ sql ...