51nod-1515 明辨是非——并查集
给n组操作,每组操作形式为x y p。
当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等;否则输出NO,并忽略此次操作。
当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 ;否则输出NO,并忽略此次操作。
输入一个数n表示操作的次数(n<=1*10^5)
接下来n行每行三个数x,y,p(x,y<=1*10^8,p=0 or 1)
对于n行操作,分别输出n行YES或者NO
3
1 2 1
1 3 1
2 3 0
YES
YES
NO 这题目描述实在是很迷,看了半天才明白,一共三种关系,相等,不相等和不确定,只有YES操作会改变不确定关系。
用set来维护限制不相等的数,用并查集维护限制相等的数,两个数从不确定到不相等,互相插入对方的set;两个数从不确定到相等,改变他们的父结点,默认将小的那个集合的父结点改成大的,就是大吃小的意思。
#include <iostream>
#include <cstdio>
#include <set>
#include <map> using namespace std; const int MAXN = 2e5 + ; int n, cnt = ,f[MAXN];
set<int> nt[MAXN];
map<int, int> eq; int find(int x)
{
return f[x] == x ? x : f[x] = find(f[x]);
} int main()
{
//freopen("in.txt","r",stdin);
cin>>n;
n +=;
for (int i = ; i <= n; i++)
{
f[i] = i;
}
n -=; int x, y, p;
while (n--)
{
cin>>x>>y>>p;
if (eq[x])//计数标号
{
x = eq[x];
}
else
{
++cnt;
eq[x]=cnt;
x=cnt;
}
if (eq[y])
{
y = eq[y];
}
else
{
++cnt;
eq[y]=cnt;
y=cnt;
}
int u = find(x), v = find(y);
if (p == )//限制相等
{
if (nt[u].count(v)) //限制不相等
{
cout<<"NO"<<endl;
}
else if (u != v) //未限制但并未相等
{
if (nt[u].size() > nt[v].size())
{
swap(u, v);
}
f[u] = v;
set<int>::iterator it;
for (it = nt[u].begin(); it != nt[u].end(); it++)
{
nt[*it].insert(v);
nt[v].insert(*it);
}
cout<<"YES"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
else//限制不相等
{
if (u == v)
{
cout<<"NO"<<endl;
}
else
{
nt[u].insert(v);
nt[v].insert(u);
cout<<"YES"<<endl;
}
}
} return ;
}
51nod-1515 明辨是非——并查集的更多相关文章
- 51nod 1515 明辨是非 [并查集+set]
今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间 ...
- 51Nod 1515 明辨是非 —— 并查集 + 启发式合并
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 1515 明辨是非 题目来源: 原创 基准时间限制:1 ...
- 51nod 1515 明辨是非 并查集 + set + 启发式合并
给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...
- 51nod 1515 明辨是非 并查集+set维护相等与不等关系
考试时先拿vector瞎搞不等信息,又没离散化,结果好像MLE:后来想起课上讲过用set维护,就开始瞎搞迭代器...QWQ我太菜了.. 用并查集维护相等信息,用set记录不相等的信息: 如果要求变量不 ...
- 51 nod 1515 明辨是非(并查集合并)
1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...
- 51nod 1204 Parity(并查集应用)
1204 Parity 题目来源: Ural 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 你的朋友写下一串包含1和0的串让你猜,你可以从中选择一个连续的子串 ...
- 51nod 1515:明辨是非 并查集合并
1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...
- 51nod 1515 明辨是非 启发式合并
1515 明辨是非 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 Description 给n组操 ...
- 51nod1515 明辨是非 并查集 + set
一开始想的时候,好像两个并查集就可以做......然后突然懂了什么.... 相同的并查集没有问题,不同的就不能并查集了,暴力的来个set就行了..... 合并的时候启发式合并即可做到$O(n \log ...
随机推荐
- The First Scrum Meeting!
第六周会议 情况简述 会议概要:明确需求,确定目标 参与人员:詹晓宇 谢赛金 熊紫仁 徐翠萍 周娟 孙尚煜 讨论时间:2019-10-24 会议地点:六区研讨性教室 具体内容 根据之前做的P ...
- Linux内核学习-进程
先说几个术语: 一.Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的.重点:代码段.数据段.堆栈段,这是一个概念堆.栈.全局区.常量区,这是另一个 ...
- LR之-参数化
1.改变参数化主要在于select next now和update value on这个二个选项 sequential:顺序取值 random:随机取值 unique:唯一取值 same line a ...
- [bzoj3733]Iloczyn 题解(搜索剪枝)
3733: [Pa2013]Iloczyn Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 741 Solved: 217[Submit][Statu ...
- websocket 文件上传
<template> <div class="pad20"> <input id="file" ref="f ...
- 移动 web 端屏幕适配 - rem
前言 最近整理了一下以前学习前端的笔记,发现自己对移动 web 端屏幕适配(rem)这一块并没有真正理解,只是会用.接下来,把自己的一些对移动 web 端屏幕适配(rem)的思考记录下来. rem 介 ...
- 监听器、拦截器完成对session、cookie的会话控制
package com.trsmedia.interceptor; import java.util.Date; import java.util.Timer; import java.util.Ti ...
- 用scp实现多服务器文件分发
需要安装expect环境 yum install expect -y vi ip.txt #主机地址池 192.168.1.1 192.168.1.2 192.168.3.3 #如果是同一网段也可以不 ...
- JSP 虚拟路径设置
编辑server.xml 在Host标签内加 :path为虚拟路径 docBase为绝对路径 <Context path="/icon" docBase="C ...
- 什么是AngularJs?特点是什么?和JQuery什么区别和联系
什么是AngularJs? AngularJs是js框架,集中操作数据,不关注Dom操作,适用于以数据操作为主的的SPA(单页应用). 它的特点 采用MVC模型 双向数据绑定 依赖注入 模块化 与jQ ...