题解 [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的变量 ...
随机推荐
- 洛谷 P1220 关路灯 区间DP
题目描述 某一村庄在一条路线上安装了 n 盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了 ...
- mysql数据库 创建、查看、重命名、复制和删除的基本操作
在数据库中,表是最重要.最基本的对象,是存储数据的基本单位.数据表从哪里来呢?数据表由关系模式转换而来.但不是简单的转换. 在设计表结构时要考虑下面几个方面: 字段名要通俗易懂且具有代表性,字段名不允 ...
- JS数组与对象赋值问题
在W3C的在线编程中经过测试发现以下问题: 当一个数组内部元素为对象时,给数组赋值应该先给对象赋值,然后把该对象push到数组中. 如下所示: 在控制台打印之后的数据格式为下图所示: 如果在给数组赋值 ...
- 获取本机SqlServer名称
using System.Data.Sql; //检索包含有关可用SQL Server实例的信息的表,必须先使用共享/静态Instance属性来检索枚举器 SqlDataSourceEnumerato ...
- 521我发誓读完本文,再也不会担心Spring配置类问题了
当大潮退去,才知道谁在裸泳.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...
- 数据可视化之powerBI入门(六)PowerQuery:横向/纵向追加数据
https://zhuanlan.zhihu.com/p/64148432 上一篇文章都是在原表数据基础上的分分合合,但做数据分析的时候还经常需要在原有数据的基础上增加一些辅助数据,比如加入新列.新行 ...
- 数据可视化之PowerQuery篇(十六)使用Power BI进行流失客户分析
https://zhuanlan.zhihu.com/p/73358029 为了提升销量,在不断吸引新客户的同时,还要防止老客户离你而去,但每一个顾客不可能永远是你的客户,不可避免的都会经历新客户.活 ...
- Docker 基础知识 - 使用卷(volume)管理应用程序数据
卷(volumes)是 Docker 容器生产和使用持久化数据的首选机制.绑定挂载(bind mounts)依赖于主机的目录结构,卷(volumes)完全由 Docker 管理.卷与绑定挂载相比有几个 ...
- 并发编程AQS----共享锁
Semaphore Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目.应用场景:资源访问,服务限流. Semaphore 实现AbstractQueuedSynchro ...
- echarts 踩坑 : id必须不同
我们可能用react前端框架开发项目. 也就是组件化开发. 一个页面里可能有很多组件. 而echarts是寻找特定ID的DOM去渲染的. 也就是说,如果整个页面.包括所有页面组件,有id相同的DOM, ...