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 ;
}

最新文章

  1. 魅力 .NET:从 Mono、.NET Core 说起
  2. Git安装
  3. 年底发福利了——分享一下我的.NET软件开发资源
  4. 说说Statement、PreparedStatement和CallableStatement的异同(转)
  5. NodeMCU初探
  6. git 创建branch分支
  7. Rsync+sersync文件实时同步
  8. Java读取excel指定sheet中的各行数据,存入二维数组,包括首行,并打印
  9. 1. SQL Server服务器监控实现方法
  10. Linq to sql 接收存储过程返回的多个结果集
  11. php中的ceil和floo以及round函数
  12. hdu_5085_Counting problem(莫队分块思想)
  13. Eclipse配置Git发布项目到Github
  14. C#重的数组、集合(ArrayList)、泛型集合(list&lt;T&gt;)三者比较及扩展延伸……
  15. 解决nginx FastCGI sent in stderr: “Primary script unknown”
  16. rsync源目录写法的一点小细节
  17. Demo1
  18. jstl-----之&lt;set&gt;标签
  19. WIN7右键在目录当前打开命令行Cmd窗口
  20. 高级版本VS打开低版本VS工程,无法调试的问题

热门文章

  1. js实现强大功能
  2. 操作系统--进程管理1--单个CPU情况
  3. vue2.0实现在table中实现全选和反选
  4. 面试时,当你有权提问时,别客气,这是个逆转的好机会(内容摘自Java Web轻量级开发面试教程)
  5. 磁盘管理之 raid 文件系统 分区
  6. VMware三种网络模式
  7. css元素选择器 first-child nth-child
  8. svg snap 笔记
  9. layui数据表格以及传数据方式
  10. 02.JSP内置对象