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]明辨是非的更多相关文章

  1. 题解51nod1515——明辨是非

    前提 在这道题老师讲过之后,再考时,我还是WA了ヽ(*.>Д<)o゜果然,我还是好菜啊~%?…,# *'☆&℃$︿★? 谢谢Jack_Pei dalao的帮忙.~~O(∩_∩)O~ ...

  2. 51nod1515 明辨是非 并查集 + set

    一开始想的时候,好像两个并查集就可以做......然后突然懂了什么.... 相同的并查集没有问题,不同的就不能并查集了,暴力的来个set就行了..... 合并的时候启发式合并即可做到$O(n \log ...

  3. 51nod-1515 明辨是非——并查集

    给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...

  4. 51 nod 1515 明辨是非(并查集合并)

    1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...

  5. 51nod 1515 明辨是非 启发式合并

    1515 明辨是非 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 Description 给n组操 ...

  6. 51nod 1515 明辨是非 [并查集+set]

    今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间 ...

  7. 51Nod 1515 明辨是非 —— 并查集 + 启发式合并

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 1515 明辨是非  题目来源: 原创 基准时间限制:1 ...

  8. 51nod 1515:明辨是非 并查集合并

    1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...

  9. 51nod 1515 明辨是非 并查集 + set + 启发式合并

    给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...

随机推荐

  1. C语言:结构体与数组

    #include <stdio.h> struct book{ ]; ]; int price; }; ] = {,,,,,,,,,}; int main(){ struct book * ...

  2. Nodejs生态圈的TypeScript+React

    基于Nodejs生态圈的TypeScript+React开发入门教程   基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程 ...

  3. [py]给函数传递数组和字典

    一 , 1.1传元组 def fun(x): print x t=(1,2) fun(t) 1.2传元组 #传元组 def fun(x,y): print x,y # t=(1,2) t=(1,2,3 ...

  4. QT TCP文件上传服务器

    利用QT做为client端,纯C语言做为server端,利用tcp协议,实现client端向server端传递文件 Linux服务器端 //头文件 #include <stdio.h> # ...

  5. jboss:在standalone.xml中设置系统属性(system-properties)

    就象在.net的web应用中,可以在web.config中设置appSettings一样,jboss的standalone.xml中也可以由开发人员自行添加系统属性,用法如下: </extens ...

  6. swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者

    Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...

  7. 移动端页面(css)调试之“weinre大法”

    移动端页面调试一般分两步.第一步我们需要把本地(pc端)写的页面效果展现在移动端,一个很方便的办法是用 fiddler 作为代理,具体可以参考 如何用 fiddler 代理调试本地手机页面,这样我们就 ...

  8. stack overflow错误分析

    stack overflow(堆栈溢出)就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据. 或者解释为 在长字符串中嵌入一段代码,并将过程的返回地址 ...

  9. PC互联网和移动互联网的本质差别

    网一代,我们先称为PC互联网,这大约可以从2010年作为分界,然后就是基于手机,及可穿戴的移动互联网. 在PC时代,软件都很庞大复杂,甚至客端端和网页混合,比如常见的桌面软件,Office及Photo ...

  10. Codeforces Round #370(div 2)

    A B C :=w= D:两个人得分互不影响很关键 一种是f[i][j]表示前i轮,分差为j的方案数 明显有f[i][j]=f[i-1][j-2k]+2*f[i-1][j-2k+1]+...+(2k+ ...