今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油!

题目链接:51nod 1515 明辨是非 [并查集]

1515 明辨是非

题目来源: 原创

基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

给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示例

3 1 2 1 1 3 1 2 3 0

Output示例

YES YES NO

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <limits.h>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long ll;
const int N = 1e5+;
int fa[N], r[N]; map <int, int> vis;
set <int> s[N];
set <int> :: iterator it;
struct node{
int x, y, p;
}q[N];
int fin(int x) {
if(x != fa[x]) fa[x] = fin(fa[x]);
return fa[x];
}
void uni(int a, int b) {
if(r[a] > r[b]) {
for(it = s[b].begin(); it != s[b].end(); it++) {
// s[a].insert(*it);
int x = fin(*it);
s[*it].erase(b);
s[a].insert(x);
s[x].insert(a);
}
fa[b] = a;
r[a]++;
}
else {
for(it = s[a].begin(); it != s[a].end(); it++) {
//s[b].insert(*it);
int x = fin(*it);
s[*it].erase(a);
s[b].insert(x);
s[x].insert(b);
}
fa[a] = b;
r[b]++;
}
}
int main() {
int n, x, y, t = ;
scanf("%d", &n); for (int i = ; i <= n; ++i) {
scanf("%d%d%d", &x, &y, &q[i].p);
if(!vis[x]) {vis[x] = t; q[i].x = t++;}
else q[i].x = vis[x]; if(!vis[y]) {vis[y] = t; q[i].y = t++;}
else q[i].y = vis[y];
}
for(int i = ; i <= n; ++i) {
fa[q[i].x] = q[i].x;
fa[q[i].y] = q[i].y;
}
for(int i = ; i <= n; ++i) {
t = ;
x = fin(q[i].x);
y = fin(q[i].y);
if(q[i].p) {
if(x == y) puts("YES");
else {
/*for(it = s[x].begin(); it != s[x].end(); it++) {
if(s[y].count(*it)) {
t = 1;
break;
}
}
for(it = s[y].begin(); it != s[y].end(); it++) {
if(s[x].count(*it)) {
t = 1;
break;
}
}
if(t) puts("NO");*/
if(s[x].count(y) || s[y].count(x)) puts("NO");
else {
puts("YES");
uni(x, y);
}
}
}
else {
if(x == y) puts("NO");
else {
puts("YES");
s[x].insert(y);
s[y].insert(x);
}
}
}
return ;
}

51nod 1515 明辨是非 [并查集+set]的更多相关文章

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

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

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

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

  3. 51nod 1515 明辨是非 并查集+set维护相等与不等关系

    考试时先拿vector瞎搞不等信息,又没离散化,结果好像MLE:后来想起课上讲过用set维护,就开始瞎搞迭代器...QWQ我太菜了.. 用并查集维护相等信息,用set记录不相等的信息: 如果要求变量不 ...

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

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

  5. 51nod 1204 Parity(并查集应用)

    1204 Parity 题目来源: Ural 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串 ...

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

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

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

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

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

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

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

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

随机推荐

  1. C#(Winform)禁用TextBox控件的鼠标事件

    1. 继承TextBox,然后重写父类的部分方法,核心代码如下 public class MyTextBox : TextBox { protected override void WndProc(r ...

  2. 自定义控件如何给特殊类型的属性添加默认值 z(转)

    自定义控件如何给特殊类型的属性添加默认值 z 定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚 标题有点那啥,但确实能表达我掌握此法后的心情. 写自定义控件时往往会有一个需求,就 ...

  3. 周记3——解决fixed属性在ios软键盘弹出后失效的bug

    这周在做空间(“类似”qq空间)项目.首页是好友发表的说说,可以针对每条说说进行评论,评论框吸附固定在屏幕底部.此时,Bug来了...在ios上,软键盘弹出后fixed属性失效了.后来发现,ios绝大 ...

  4. 分析apache日志,统计访问量

    cat nondomain_access_log.20090722 |awk '{print $1}'| sort | uniq -c |sort -nr

  5. 连锁咖啡厅B/S架构点餐系统开发

    需求号:5255128 http://task.zhubajie.com/5255128/ 具体要求: 网站用途:连锁咖啡厅B/S架构点餐系统开发开发周期:1.5个月功能要求: 支持触摸屏点菜.无线P ...

  6. window.open()被浏览器拦截问题汇总

    一.问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多用户根本不知道发 ...

  7. 02.ToString()方法详解

    ToString()使用方法汇总(C#) C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 ...

  8. Eclipse提示workspaces is use

    问题描述: 有时候因为强行关闭Eclipse导致再次打开出现workspace提示正在使用 解决办法: 删除workspace目录下隐藏文件夹 .metadata 中的 .lock 文件 worksp ...

  9. Java温故而知新(5)设计模式详解(23种)

    一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目 ...

  10. java计数

    计数 package com.demo; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent ...