[51nod 1515] 明辨是非
Description
给\(n\)组操作,每组操作形式为\(x\;y\;p\)。
当\(p\)为\(1\)时,如果第\(x\)变量和第\(y\)个变量可以相等,则输出\(YES\),并限制他们相等;否则输出\(NO\),并忽略此次操作。
当\(p\)为\(0\)时,如果第\(x\)变量和第\(y\)个变量可以不相等,则输出\(YES\),并限制他们不相等 ;否则输出\(NO\),并忽略此次操作。
Input
输入一个数\(n\)表示操作的次数\((n<=10^5)\)
接下来\(n\)行每行三个数\(x\;y\;p\) \((x,y<=10^8,0≤p≤1)\)
Output
对于\(n\)行操作,分别输出\(n\)行\(YES\)或者\(NO\)
Solution
没想到假的启发式合并也能A题啊。。。
正解其实跟考试时候的思路差不多
但是不是维护每个联通块的大小
因为有可能一个联通块大小比较小但是连出去的边有很多
所以我们要换一种数据结构维护每个联通块连出去了多少条边
用什么数据结构可以维护大小,快速查找两个元素是否有关系呢?
嗯... \(STL\) 的 \(set\) 是符合要求的 查询大小是 \(O(1)\) 的,查找是 \(O(nlogn)\) 的
所以我们用一个 \(set\) \(s[i]\) 表示以 \(i\) 为根的联通块连出去的边(这里连边表示规定两个联通块严格不相等)
考虑操作
如果要求两个变量相等,那么就在两个联通块的 \(set\) 里找是否存在一条边连到了对方,如果有,那么此条件无法满足。
如果要求两个变量不相等,那么假设它们不在一个联通块里,需要合并这两个联通块,就要用到启发式合并了。
注意到我们已经记录了两个联通块连出去边的个数了, 为了保证复杂度,一定是想让连边少的联通块合并到连边多的联通块里。这就是启发式合并了。
Code
#include<set>
#include<map>
#include<cstdio>
#define N 100005
int n,tot;
int ques[N][5];
int father[N<<1];
std::map<int,int> mp;
std::set<int> s[N<<1];
int find(int x){
if(father[x]==x) return x;
return father[x]=find(father[x]);
}
signed main(){
scanf("%d",&n);
for(int x,y,i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&ques[i][3]);
if(!mp[x]) mp[x]=++tot;
if(!mp[y]) mp[y]=++tot;
ques[i][1]=mp[x];
ques[i][2]=mp[y];
}
for(int i=1;i<=tot;i++) father[i]=i;
for(int i=1;i<=n;i++){
int r1=find(ques[i][1]);
int r2=find(ques[i][2]);
if(ques[i][3]==1){
if(r1==r2) {puts("YES");continue;}
if(s[r1].find(r2)!=s[r1].end() or s[r2].find(r1)!=s[r2].end()){
puts("NO");
continue;
}
if(s[r1].size()>s[r2].size()) r1^=r2^=r1^=r2;
std::set<int>::iterator it;
for(it=s[r1].begin();it!=s[r1].end();it++)
s[r2].insert(*it),s[*it].insert(r2),s[*it].erase(r1);
father[r1]=r2;
puts("YES");
}
else{
if(r1==r2) {puts("NO");continue;}
if(s[r1].find(r2)!=s[r1].end() or s[r2].find(r1)!=s[r2].end()){
puts("YES");
continue;
}
s[r1].insert(r2);
s[r2].insert(r1);
puts("YES");
}
}
return 0;
}
[51nod 1515] 明辨是非的更多相关文章
- 51nod 1515 明辨是非 [并查集+set]
今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间 ...
- 51nod 1515 明辨是非 启发式合并
1515 明辨是非 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 Description 给n组操 ...
- 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记录不相等的信息: 如果要求变量不 ...
- 51nod 1515:明辨是非 并查集合并
1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...
- 51 nod 1515 明辨是非(并查集合并)
1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
随机推荐
- Android ColorMatrix类图像颜色处理-黑白老照片、泛黄旧照片、高对比度等效果
在Android中,对图像进行颜色方面的处理,如黑白老照片.泛黄旧照片.高对比度.低饱和度等效果,都可以通过使用颜色矩阵(ColorMatrix)来实现. 1.颜色矩阵(ColorMatrix)介绍 ...
- AndroidStudio如何快速制作.so
之前写过一篇Eclipse制作.so的文章,http://blog.csdn.net/baiyuliang2013/article/details/44306921使用的是GNUstep模拟Linux ...
- 【OpenGL】理解一些基本问题
写在前面 啦啦啦,搞了很久的Unity Shaders,越学越觉得基础知识很重要.学Unity Shader的时候,总会想,shader到底是什么呢?shader的pipeline是什么呢?它们是怎么 ...
- Android 文件操作心得体会
android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入 ...
- 可视化分析工具Cytoscape使用记录
最近项目要使用到可视化分析工具Cytoscape,所以会花费很多的时间跟精力来整理Cytoscape软件使用和开发的相关资料,希望写下的文章能减少有兴趣的同行学习跟开发所走的弯路时间.同时也是因为百度 ...
- 使用FMDB多线程访问数据库,及database is locked的问题
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizi ...
- Java进阶(三)Java安全通信:HTTPS与SSL
通过一个系统,接触到了Java安全机制,故作一小节,供朋友们参考学习. 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure ...
- python 内存NoSQL数据库
python 内存NoSQL数据库 来自于网络,经过修改,秉承Open Source精神,回馈网络! #!/usr/bin/python #-*- coding: UTF-8 -*- # # memd ...
- Linux信号实践(2) --信号分类
信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...
- iOS 使用AVAudioPlayer开发录音功能
最近要做一个类似对讲的功能,所以需要用到录音上传,然后再播放的功能. 一.音频格式分析 因为之前没研究过音频这块,所以很多音频格式都是第一次见. AAC: AAC其实是"高级音频编码(adv ...