【NOI 2015】程序自动分析

2023-11-19

【题目】

传送门

题目描述:

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

考虑一个约束满足问题的简化版本:假设 x 1 , x 2 , x 3 , … , x n x_1,x_2,x_3,\dots,x_n x1,x2,x3,,xn 代表程序中出现的变量,给定 n n n 个形如 x i = x j x_i=x_j xi=xj x i ≠ x j x_i≠x_j xi̸=xj 的变量相等 / / /不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。

例如,一个问题中的约束条件为: x 1 = x 2 , x 2 = x 3 , x 3 = x 4 , x 1 ≠ x 4 x_1=x_2,x_2=x_3,x_3=x_4,x_1≠x_4 x1=x2,x2=x3,x3=x4,x1̸=x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。

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

输入格式:

1 1 1 行包含 1 1 1 个正整数 t t t ,表示需要判定的问题个数。注意这些问题之间是相互独立的。

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

1 1 1 行包含 1 1 1 个正整数 n n n ,表示该问题中需要被满足的约束条件个数。

接下来 n n n 行,每行包括 3 3 3 个整数 i i i j j j e e e ,描述 1 1 1 个相等 / / /不等的约束条件,相邻整数之间用单个空格隔开。若 e = 1 e=1 e=1 ,则该约束条件为 x i = x j x_i=x_j xi=xj;若 e = 0 e=0 e=0,则该约束条件为 x i ≠ x j x_i≠x_j xi̸=xj

输出格式:

输出文件包括 t t t 行。

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

样例数据:

【样例 1 1 1

输入
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1

输出
NO
YES

【样例 2 2 2

输入
2
3
1 2 1
2 3 1
3 1 1
4
1 2 1
2 3 1
3 4 1
1 4 0

输出
YES
NO

备注:

【样例 1 1 1 说明】
在第一个问题中,约束条件为: x 1 = x 2 , x 1 ≠ x 2 x_1=x_2,x_1≠x_2 x1=x2,x1̸=x2 。这两个约束条件互相矛盾,因此不可被同时满足。

在第二个问题中,约束条件为: x 1 = x 2 , x 2 = x 1 x_1=x_2,x_2=x_1 x1=x2,x2=x1 。这两个约束条件是等价的,可以被同时满足。

【样例 2 2 2 说明】
在第一个问题中,约束条件有三个: x 1 = x 2 , x 2 = x 3 , x 3 = x 1 x_1=x_2,x_2=x_3,x_3=x_1 x1=x2,x2=x3,x3=x1 。只需赋值使得 x 1 = x 2 = x 3 x_1=x_2=x_3 x1=x2=x3,即可同时满足所有的约束条件。

在第二个问题中,约束条件有四个: x 1 = x 2 , x 2 = x 3 , x 3 = x 4 , x 1 ≠ x 4 x_1=x_2,x_2=x_3,x_3=x_4,x_1≠x_4 x1=x2,x2=x3,x3=x4,x1̸=x4 。由前三个约束条件可以推出 x 1 = x 2 = x 3 = x 4 x_1=x_2=x_3=x_4 x1=x2=x3=x4 ,然而最后一个约束条件却要求 x 1 ≠ x 4 x_1≠x_4 x1̸=x4,因此不可被满足。

【数据范围】
在这里插入图片描述


【分析】

其实这道题好像没有想象中那么难。。。

先满足所有 x i = x j x_i=x_j xi=xj 的约束条件,直接用一个并查集维护就行

而对于 x i ≠ x j x_i≠x_j xi̸=xj 的条件,就判断 x i x_i xi x j x_j xj 是否在同一个集合,若在,说明 x i x_i xi 本应等于 x j x_j xj,就矛盾了

然后注意一下, x x x 的最大值达到 1 0 9 10^9 109,所以要使用离散化


【代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
pair<int,int>unequal[N];
int n,num,sum,x[N],y[N],op[N],father[N<<1],d[N<<1];
void discrete(int sum)
{
	sort(d+1,d+sum+1);
	int m=unique(d+1,d+sum+1)-d-1;
	for(int i=1;i<=n;++i)
	{
		x[i]=lower_bound(d+1,d+m+1,x[i])-d;
		y[i]=lower_bound(d+1,d+m+1,y[i])-d;
	}
}
int find(int x)
{
	if(father[x]==x)  return x;
	return father[x]=find(father[x]);
}
void Merge(int x,int y)
{
	x=find(x),y=find(y);
	if(x!=y)  father[x]=y;
}
int main()
{
	int t,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		int num=0,sum=0;
		for(i=1;i<=(n<<1);++i)
		  father[i]=i;
		for(i=1;i<=n;++i)
		{
			scanf("%d%d%d",&x[i],&y[i],&op[i]);
			d[++sum]=x[i],d[++sum]=y[i];
		}
		discrete(sum);
		for(i=1;i<=n;++i)
		{
			if(op[i]==1)  Merge(x[i],y[i]);
			else  unequal[++num]=make_pair(x[i],y[i]);
		}
		for(i=1;i<=num;++i)
		{
			int x=find(unequal[i].first);
			int y=find(unequal[i].second);
			if(x==y){puts("NO");goto end;}
		}
		puts("YES");end:;
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【NOI 2015】程序自动分析 的相关文章

  • getopts命令详解

    http blog sina com cn s blog 616b428f01019z5l html http blog csdn net wesleyluo article details 5279875 写程序的时候经常要处理命令行参数

随机推荐

  • 程序员办公桌都如此霸气,网友:砖头当杯垫也是不敢惹!

    程序员初入职场 办公桌上可能就一台电脑 一个键盘 一个鼠标 还有就是一个水杯 然而对于老程序员们来说 他们的办公桌肯定会有一大波能符合他们气质的 神器 今天小编就来带大家看看这些 总听人说不会写bug的程序员一定不是个好的产品经理 程序员们
  • 如何在git已有项目中创建空分支

    一 背景 在git中创建一个新的分支都需要指定一个父节点 即必须基于已有的分支创建新的分支 项目已经开发 维护了一段时间如果master分支不是主分支的话 但创建一个新的空分支在实际的项目中又是一种常见需求 比如 项目的某个分支已经演化的比
  • 弱网测试

    首先我们要清楚什么是弱网呢 举一个例子 我们在一个封闭环境中 有时候APP打开的特别慢 或者是一直加载不出来我们想要看到的信息 也就是说这个时候的网速特别的慢 这种状态呢 我们可以理解为弱网 弱网直接造成的影响有丢包 数据无法加载 消息更新
  • Js中async/await的执行顺序详解

    前言 虽然大家知道async await 但是很多人对这个方法中内部怎么执行的还不是很了解 本文是我看了一遍技术博客理解 JavaScript 的 async await 如果对async await不熟悉可以先看下这篇文章 后拓展了一下
  • Tomcat调优常见参数配置

    Tomcat 是一个流行的 Web 应用服务器 以下是一些常见的 Tomcat 配置参数 1 端口配置 HTTP 端口 tomcat 默认使用 8080 端口 可以通过修改 server xml 文件中的 Connector 配置来更改端口
  • QT学习OpenGL序列: Texture

    学习OpenGL文理 1 头文件 ifndef COPENGLWIDGETHELLOTEXTURES H define COPENGLWIDGETHELLOTEXTURES H 控件名称 Hello Textures 注意 STD C Ve
  • Vim中多行删除

    在操作虚拟机的时候 都会出错 当在vim中出现问题的时候 可以在dw普通模式下删除对应的单词 如果在vim中使用多行删除 可以使用dd vim 命令 将行数添加到该命令中 如10dd将从光标底部删除10行 包含光标行在内 删除单行 1 按
  • The Necklace 【UVA - 10054】【欧拉回路详解】

    题目链接1 题目链接2 题目求的是一串珠子 要让它们首尾相互照应才能串起来 并且 最后要连成一个环 使得最后的珠子的尾与第一个珠子的头相互对应 那么 这道题就是道求欧拉回路的题了 我们要先判断这是不是能够构成欧拉回路 这是个无向图 再对于需
  • 密码学原语如何应用?解析密文同态性的妙用

    隐私数据在密文形式下是否依旧可以加减乘除 其背后的同态性原理具体指什么 半同态性和全同态性有什么区别 单密钥和多密钥同态加密有哪些奇妙的应用场景 隐私保护方案设计 往往需要在密文状态下 对隐私数据进行特定的业务操作 以此保障数据的机密性 沿
  • Tomcat单实例安装部署

    自说 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 属于轻量级应用服务器 主要用于处理动态web数据 部署java环境 上传jdk包 使用xftp上传 解压 tar zxvf u01 jdk 8u333 linux i58
  • 傻傻分不清楚的sort,sorted,reverse,reversed

    前言 在平常编码过程中 列表是经常用的 而常用的方法也基本就是遍历循环进行元素的append 还有很多方法不熟悉 比如有一次遇到一个问题 将一个列表进行反转 拿起百度 得到答案 方法1 列表切片 步长设置为 1 方法2 列表自带方法 lst
  • 软件测试面试经验及面试题目分享

    关于面试 不同的公司千差万别 面试bat 创业公司 外包 难度和轮数差异巨大 但是有个共同点就是都是面试造航母 工作拧螺丝 意思就是说工作起来其实很容易 但是要过面试却很难 包括每天大家学习新技能很大一部分就是为了跳槽加薪 直接一点来说 其
  • 监控程序运行状态,并根据状态启动或重启进程

    监控程序运行状态 并根据状态启动或重启进程 需求 设计思路 实现 需求 根据运行环境要求 我们所做的程序常常会在无人监管的情况下运行几个月之久 所以为了保证程序的正常运行 决定添加一个附属的监控程序 监控程序要求如下 当检测到主程序未启动时
  • @RequestMapping、@PostMapping、@GetMapping的区别

    GetMapping 用于将HTTP GET请求映射到特定处理程序方法的注释 具体来说 GetMapping是一个作为快捷方式的组合注释 RequestMapping method RequestMethod GET PostMapping
  • QT_下拉选项框_Combo Box_使用

    添加选项 第一种 UI界面静态添加 如下 第二种 代码添加 如下 1 在mainwindow h头文件中添加创建用函数 2 定义函数 void MainWindow add combobox void ui gt comboBox gt a
  • JavaCollection集合

    5 Collection集合 5 1 Collection集合概述 是单列集合的顶层接口 它表示一组对象 这些对象也称Collection元素 JDK不提供此接口的直接实现 它提供更具体的子接口 Set 和 List 实现 package
  • 取消计算机系统密钥,BitLocker驱动器被加密怎么恢复密钥 忘了密码取消删除方法...

    由于最近电脑蓝屏 我需要U盘制作启动盘 结果U盘插入到我电脑 我发现此U盘被我以前用BitLocker加密过了 BitLocker密码我也忘记了 我只好去我以前旧电脑去找 BitLocker 驱动器加密恢复密钥 还好我旧电脑以前保存过了 我
  • WordPress(6)网站侧边栏倒计时进度小工具

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 效果图 在这里插入图片描述 一 添加位置 二 主题style css文件中添加美化 1 引入库 2 添加自定义的HTML模块 效果图 提示 以下是本篇文章正文内容
  • 重要-作为Android开发者必须了解的Gradle知识

    https www jianshu com p c31513f5f550
  • 【NOI 2015】程序自动分析

    题目 传送门 题目描述 在实现程序自动分析的过程中 常常需要判定一些约束条件是否能被同时满足 考虑一个约束满足问题的简化版本 假设 x 1 x 2