博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1515:明辨是非 并查集合并
阅读量:7055 次
发布时间:2019-06-28

本文共 1423 字,大约阅读时间需要 4 分钟。

题目来源: 原创
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 
 收藏
 关注

给n组操作,每组操作形式为x y p。

当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等;否则输出NO,并忽略此次操作。

当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 ;否则输出NO,并忽略此次操作。

Input
输入一个数n表示操作的次数(n<=1*10^5)接下来n行每行三个数x,y,p(x,y<=1*10^8,p=0 or 1)
Output
对于n行操作,分别输出n行YES或者NO
Input示例
31 2 11 3 12 3 0
Output示例
YESYESNO

考虑用并查集维护相等关系,用set维护不等关系。

就是说相等的放在一个并查集里面,这个集合开个set,其中存放和它不等的并查集序号。
如果限制不相等,显然就是在set中添加元素
如果限制相等,那么我们可以通过启发式合并将两个并查集以及他们对应的set合并
复杂度为n*(logn)^2

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable:4996) using namespace std;int pre[200005];int x[100005];int y[100005];int oper[100005];int num[200005];set
notequal[50005];int n,m,shizu1,shizu2; set
::iterator it1,it2;map
hash_m;int findpre(int x) { while(x!=pre[x]) { x=pre[x]; } return x; } void union_set(int x,int y) { int pre_x = x; int pre_y = y; if(pre_x == pre_y) return; else if(notequal[pre_y].size()>notequal[pre_x].size()) { int temp = pre_x; pre_x = pre_y; pre_y = temp; } pre[pre_y]=pre_x; for(it2=notequal[pre_y].begin();it2!=notequal[pre_y].end();it2++) { notequal[pre_x].insert(*it2); }} template
F bin_search(F s,F e,T val){ F L = s; F R = e-1; while(L<=R) { F mid = L + (R-L)/2; if(!(*mid

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/lightspeedsmallson/p/4899518.html

你可能感兴趣的文章
blog小记
查看>>
我的友情链接
查看>>
fileoper.py
查看>>
我的友情链接
查看>>
shell脚本将指定目录下前3天日期目录使用tar打包后并将其删除源日期目录
查看>>
类的静态成员
查看>>
osi七层模型的分类
查看>>
潍坊SEO教程之网站关键词密度
查看>>
HTTPS原理和CA证书申请(满满的干货)
查看>>
跨交换机实现VLAN
查看>>
mysql客户端的使用
查看>>
AIX创建删除page space
查看>>
scala 中的 日期格式化
查看>>
php面向对象
查看>>
Linux基础:日志管理
查看>>
Java中的多线程你只要看这一篇就够了
查看>>
第二章习题答案
查看>>
关于硬盘的一切!
查看>>
如何解决90%的报表设计难题?300张报表模板任君挑选
查看>>
EL函数库(由JSTL提供的)
查看>>