【NOI2015】程序自动分析
https://www.luogu.org/problem/show?pid=1955
并查集+离散化。
先执行所有x=y问题,即合并x和y。
再依次执行所有x!=y问题,即查询x和y是否处于同一集合。如果是,则有x=y且x!=y,不满足条件。
如果所有的x!=y都得到满足,这组数据就可以满足。
注意到i,j范围为[1,1e9],并查集数组开不了这么大的范围。又注意到n范围只有[1,1e5],考虑离散化。
先读入所有出现的数字,存到一个数组,然后排序并去重。之后操作用到的数字都在这个数组进行二分查找。
时间复杂度O(nlogn)。
注意的坑:
- 最多有n个操作,每个操作有两个数字,所以并查集的大小应该是n*2。
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#define maxn 100005 * 2 // n个操作,每个操作两个数,最多出现n*2个数
using namespace std;
typedef unsigned long long ullint;
namespace djs
{
int parent[maxn];
inline void init()
{
for (int i = ; i < maxn; i++)
parent[i] = -;
}
inline int find(int x)
{
if (parent[x] < )
return x;
else
return parent[x] = find(parent[x]);
}
inline void merge(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
return;
else
{
//令x为rank更大的,即parent值更小的
if (parent[x] > parent[y])
swap(x, y);
parent[x] += parent[y];
parent[y] = x;
}
}
inline bool is_related(int x, int y)
{
return find(x) == find(y);
}
}
typedef pair<ullint, ullint> query;
vector<query> q, m; // 暂存查询与合并操作
vector<ullint> data; // 存储读入的所有数据
vector<ullint>::iterator unique_end; // 去重后的数据的尾后迭代器
inline int get_pos(ullint v) // 二分查找v在data所处的位置
{
return lower_bound(data.begin(), unique_end, v) - data.begin();
}
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
djs::init();
m.clear();
q.clear();
data.clear(); ullint a, b, c;
for (int i = ; i < n; i++)
{
cin >> a >> b >> c;
data.push_back(a);
data.push_back(b);
switch (c)
{
case :
m.push_back(make_pair(a, b));
break; case :
q.push_back(make_pair(a, b));
break;
}
} //离散化
sort(data.begin(), data.end());
unique_end = unique(data.begin(), data.end()); //合并
for (int i = ; i < m.size(); i++)
djs::merge(get_pos(m[i].first), get_pos(m[i].second)); //查询
bool yes = true;
for (int i = ; i < q.size(); i++)
{
if (djs::is_related(get_pos(q[i].first), get_pos(q[i].second)))
{
yes = false;
break;
}
}
if (yes)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return ;
}
【NOI2015】程序自动分析的更多相关文章
- codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析
4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 在实现 ...
- 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 在实现程序自动分析的过程中,常常需要判定一些约束条件 ...
- 【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, ...
- [NOI2015]程序自动分析(并查集,离散化)
[NOI2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的 ...
- [NOI2015]程序自动分析(并查集)
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...
- [BZOJ4195] [NOI2015] 程序自动分析 (并查集)
Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或x ...
随机推荐
- Basic Data Structure
Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 使用ichartjs生成图表
官网:http://www.ichartjs.com/ ichartjs 是一款基于HTML5的图形库.使用纯javascript语言, 利用HTML5的canvas标签绘制各式图形. ichartj ...
- SQL Server 数据类型转换函数
T-SQL提供了两个显示转换的函数:CAST函数和CONVERT函数. 1. CAST函数 语法: CAST ( expression AS data_type [ ( length ) ] ) 示例 ...
- java中表示二进制、八进制、十进制、十六进制
1.进制 进制是一种记数方式 ,可以用有限的数字符号代表所有的数值.由特定的数值组成. 2.进制的表现形式 二进制: 由0和1两个数字组成. 八进制: 由0-7数字组成,为了区分与其他进制的数字区别, ...
- Android-Async-Http 特性简单分析
如下是官方文档描述此库的特点: All requests are made outside of your app’s main UI thread, but any callback logic w ...
- P3003 [USACO10DEC]苹果交货Apple Delivery
题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, she tr ...
- 解决Cordova安装Cannot find module 'bplist-parser'问题
安装完cordova出现找不到必须的模块 出现原因不明,不过如果出现这个问题,我们遇到缺什么模块就安装什么模块就可以了.如图所示
- oracle数据库管理系统常见的错误(一)
oracle数据库管理系统常见的错误之一如下: Listener refused the connection with the following error:ORA-12519, TNS:no a ...
- table固定头部,表格tbody可上下左右滑动
当表格头部固定时,需要分为两个表格来做:一部分是thead,一部分是tbody,具体实现方式如下: html代码: <div class="table_box_big"> ...
- 快速自检电脑是否被黑客入侵过(Windows版)
我们经常会感觉电脑行为有点奇怪, 比如总是打开莫名其妙的网站, 或者偶尔变卡(网络/CPU), 似乎自己"中毒"了, 但X60安全卫士或者X讯电脑管家扫描之后又说你电脑" ...