[51nod1515]明辨是非
Description
给$n$组操作,每组操作形式为$x\;y\;p$.
当$p=1$时,如果第$x$变量和第$y$个变量可以相等,则输出$YES$,并限制他们相等;否则输出$NO$,并忽略此次操作.
当$p=0$时,如果第$x$变量和第$y$个变量可以不相等,则输出$YES$,并限制他们不相等;否则输出$NO$,并忽略此次操作.
Input
输入一个数$n$表示操作的次数.接下来$n$行每行三个数$x,y,p$.
Output
对于$n$行操作,分别输出$n$行$YES$或者$NO$.
Sample Input
1 2 1
1 3 1
2 3 0
Sample Output
YES
YES
NO
HINT
$n\;\leq\;10^5,x,y\;\leq\;10^8,p=0\;or\;1$.
Solution
离散化所有的变量.
可以用并查集维护相等的关系,$set$维护不等的关系.
当$p=1$时,如果$x,y$都不在对方的$set$中,则可行,按$set$大小合并它们的父亲和$set$;
当$p=0$时,如果$f[x]\not=f[y]$,把$f[x],f[y]$分别插入对方的$set$中.
#include<set>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 200005
using namespace std;
int a[N],f[N],x[N],y[N],p[N],n,m;
set<int> s[N];
set<int>::iterator l;
inline int gf(int k){
if(f[k]==k) return k;
return f[k]=gf(f[k]);
}
inline int search(int k){
int l=,r=m,mid;
while(l<r){
mid=(l+r)>>;
if(a[mid]<k) l=mid+;
else r=mid;
}
return l;
}
inline void init(){
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%d%d%d",&x[i],&y[i],&p[i]);
a[++m]=x[i];a[++m]=y[i];
}
sort(a+,a++m);
for(int i=;i<=n;++i){
x[i]=search(x[i]);
y[i]=search(y[i]);
}
for(int i=;i<=m;++i) f[i]=i;
for(int i=,j,k,q;i<=n;++i){
j=gf(f[x[i]]);k=gf(f[y[i]]);
if(!p[i]){
if(j==k) puts("NO");
else{
puts("YES");
s[j].insert(k);
s[k].insert(j);
}
}
else{
if(j==k) puts("YES");
else if(s[j].count(k)||s[k].count(j)) puts("NO");
else{
puts("YES");
if(s[j].size()>s[k].size()){
q=j;j=k;k=q;
}
f[j]=k;
for(l=s[j].begin();l!=s[j].end();++l){
q=gf(*l);
s[*l].erase(j);
s[q].insert(k);
s[k].insert(q);
}
s[j].clear();
}
}
}
}
int main(){
freopen("judge.in","r",stdin);
freopen("judge.out","w",stdout);
init();
fclose(stdin);
fclose(stdout);
return ;
}
[51nod1515]明辨是非的更多相关文章
- 题解51nod1515——明辨是非
前提 在这道题老师讲过之后,再考时,我还是WA了ヽ(*.>Д<)o゜果然,我还是好菜啊~%?…,# *'☆&℃$︿★? 谢谢Jack_Pei dalao的帮忙.~~O(∩_∩)O~ ...
- 51nod1515 明辨是非 并查集 + set
一开始想的时候,好像两个并查集就可以做......然后突然懂了什么.... 相同的并查集没有问题,不同的就不能并查集了,暴力的来个set就行了..... 合并的时候启发式合并即可做到$O(n \log ...
- 51nod-1515 明辨是非——并查集
给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...
- 51 nod 1515 明辨是非(并查集合并)
1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...
- 51nod 1515 明辨是非 启发式合并
1515 明辨是非 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 Description 给n组操 ...
- 51nod 1515 明辨是非 [并查集+set]
今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间 ...
- 51Nod 1515 明辨是非 —— 并查集 + 启发式合并
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 1515 明辨是非 题目来源: 原创 基准时间限制:1 ...
- 51nod 1515:明辨是非 并查集合并
1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...
- 51nod 1515 明辨是非 并查集 + set + 启发式合并
给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...
随机推荐
- python读取配置文件
从/mnt目录下读取section配置文件sample.ini [db] host=192.168.1.116 hostaddr=192.168.1.116 port=5432 dbname=clas ...
- 如何在Eclipse和Tomcat的Debug过程中启用热部署
参考的地址是 http://blog.redfin.com/devblog/2009/09/how_to_set_up_hot_code_replacement_with_tomcat_and_ecl ...
- PAT 1015. 德才论 (25)
宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子 ...
- C# .net中cookie值为中文时的乱码解决方法
一.cookie的名称或子cookie的名称不能为中文,否则无法获得cookie 这个好办,名称不用中文即可 二.cookie的值为中文时候,取cookie的值会出现乱码 解决办法:存取cookie时 ...
- DefaultFilesMiddleware中间件如何显示默认页面
DefaultFilesMiddleware中间件如何显示默认页面 DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认 ...
- CoffeeScript的类继承的工具函数extends
__hasProp = {}.hasOwnProperty, __extends = function(child, parent) { // 派生类时,如果基类的类属性值是对象,那么子类的类属性只是 ...
- Hibernate大福利 下载链接
正在学马士兵Hibernate的同学来看这里,这里提供了他视频里需要的JAR包,请尽情下载,给好评喔. 一.Hibernate 3.3.2 核心JAR包 http://pan.baidu.com/s/ ...
- Theano3.4-练习之多层感知机
来自http://deeplearning.net/tutorial/mlp.html#mlp Multilayer Perceptron note:这部分假设读者已经通读之前的一个练习 Classi ...
- JS运动从入门到兴奋1
hello,我是沐晴,一个充满了才华,却靠了照骗走江湖的前端妹子.在这个充满PS的年代,这你们都信,哈哈,废话不多说,今天要分享的是关注JS运动的知识.楼主一直认为,不管学习什么,核心思想才是王道,掌 ...
- ALinq Dynamic 使用指南——慨述(上)
一.使用 1.程序集与命名空间的引用使用 ALinq Dynamic,你需要引用ALinq.Dynamic.dll(ALinq用户)或者System.Data.Linq.Dynamic.dll (Li ...