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】程序自动分析的更多相关文章

  1. codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析

    4600 [NOI2015]程序自动分析  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在实现 ...

  2. Codevs 4600 [NOI2015]程序自动分析

    4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...

  3. BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 689  Solved: 296 [Submit][Sta ...

  4. BZOJ4195 NOI2015 程序自动分析

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Description 在实现程序自动分析的过程中,常常需要判定一些约束条件 ...

  5. 【BZOJ4195】[Noi2015]程序自动分析 并查集

    [BZOJ4195][Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3 ...

  6. bzoj 4195: [Noi2015]程序自动分析

    4195: [Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表 ...

  7. [UOJ#127][BZOJ4195][NOI2015]程序自动分析

    [UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...

  8. [NOI2015]程序自动分析(并查集,离散化)

    [NOI2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的 ...

  9. [NOI2015]程序自动分析(并查集)

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...

  10. [BZOJ4195] [NOI2015] 程序自动分析 (并查集)

    Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或x ...

随机推荐

  1. lua中的require机制

    lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关的数据 ...

  2. robotframework2.8.7日志输出List乱码

    今天在完善robotframework的数据分离的时候,需要读取list中的中文信息,在日志输出中,英文显示是正常的:但是中文就出现所谓的乱码情况,如截图所示 对于list中的信息,日志显示乱码:查找 ...

  3. AngularJS学习篇(十三)

    AngularJS HTML DOM ng-disabled 指令 ng-disabled 指令直接绑定应用程序数据到 HTML 的 disabled 属性. <!DOCTYPE html> ...

  4. js中的路由匹配

    routie插件:http://projects.jga.me/routie/ /** * 路由 * @example * routie( * { * '/':function(){ }, * '/m ...

  5. python中pygame模块的Linux下安装过程

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...

  6. java 数据分页

    分页逻辑 import lombok.Data; /** * User eric * Date * Email yq@aso.ren */ @Data public class PageHelper ...

  7. eclipse中导入jsp等工程使用过程中常遇问题

    1.导入的工程JSP文件出现报错的情况 这个一般不怎么影响文件的执行,这些文件飘红主要是因为eclipse的校验问题. 具体错误信息:Multiple annotations found at thi ...

  8. 用C#操作IIS创建虚拟目录和网站

    #region CreateWebsite 添加网站 public string CreateWebSite(string serverID, string serverComment, string ...

  9. 基于 Aspose.Cells与XML导入excel 数据----操作类封装

    前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...

  10. C语 三子棋小游戏

    #include <stdio.h> #include <Windows.h> #include<time.h> #define row 3 #define lis ...