51 nod 1515 明辨是非(并查集合并)
1515 明辨是非
题目来源: 原创
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
给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
- /*
- 51 nod 1515 明辨是非(并查集合并)
- problem:
- 两种操作:
- x y 1: 如果第x,第y个数可以相同,则输出YES,并令他们相同. 否则输出NO
- x y 0: 如果第x,第y个数可以不相同 ......
- solve:
- 相同可以用并查集来维护. 但是不同则不行, 如果a,b不同, b,c不同.但是a,c可以相同. 开始脑子抽了都用并查集 卒...
- 先set记录一下每个数与其不同的数有哪些. 然后判断两个数是否不相等时直接进行查找.并要判断他们各自所在的并查集
- 合并的时候再把set处理一下就好. printf一直TL,换成putsAC.
- hhh-2016/09/04-17:18:40
- */
- #pragma comment(linker,"/STACK:124000000,124000000")
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #include <math.h>
- #include <queue>
- #include <set>
- #include <map>
- #define lson i<<1
- #define rson i<<1|1
- #define ll long long
- #define clr(a,b) memset(a,b,sizeof(a))
- #define scanfi(a) scanf("%d",&a)
- #define scanfs(a) scanf("%s",a)
- #define scanfl(a) scanf("%I64d",&a)
- #define scanfd(a) scanf("%lf",&a)
- #define key_val ch[ch[root][1]][0]
- #define eps 1e-7
- #define inf 0x3f3f3f3f3f3f3f3f
- using namespace std;
- const ll mod = 1000000007;
- const int maxn = 200010;
- const double PI = acos(-1.0);
- struct node
- {
- int x,y,kind;
- } qry[maxn];
- int id[maxn];
- set<int>q[maxn];
- map<int,int> mp;
- set<int>::iterator it;
- int par[maxn];
- int fin(int x)
- {
- if(par[x] == x) return x;
- return par[x] = fin(par[x]);
- }
- void unio(int x,int y)
- {
- if(x == y)
- return ;
- if(q[x].size() > q[y].size())
- {
- int t = x;
- x = y;
- y = t ;
- }
- par[x] = y;
- for(it = q[x].begin(); it != q[x].end(); it++)
- {
- q[y].insert(*it);
- }
- }
- int main()
- {
- // freopen("in.txt","r",stdin);
- // freopen("out.txt","w",stdout);
- int n;
- scanfi(n);
- int cnt = 0;
- for(int i = 1; i <= n; i++)
- {
- par[i] = i;
- scanfi(qry[i].x),scanfi(qry[i].y);
- scanfi(qry[i].kind);
- id[cnt++] = qry[i].x,id[cnt++] = qry[i].y;
- }
- sort(id,id+cnt);
- int total = unique(id,id+cnt)-id;
- for(int i = 0; i < total; i++)
- mp[id[i]] = i;
- // cout << total <<endl;
- // for(int i = 0;i <= total;i++)
- // cout <<id[i] <<" " ;
- // cout <<endl;
- for(int i =1 ; i <= n; i++)
- {
- // cout << qry[i].x <<" " <<qry[i].y << " "<<qry[i].kind <<endl;
- int x = mp[qry[i].x];
- int y = mp[qry[i].y];
- int tx = fin(x),ty = fin(y),flag =0;
- if(qry[i].kind == 1)
- {
- // cout << x <<" " <<y <<endl;
- if(q[tx].size() > q[ty].size())
- {
- it = q[ty].find(tx);
- if(it != q[ty].end())
- flag = 1;
- for(it = q[ty].begin(); !flag && it != q[ty].end(); it++)
- {
- if(fin(*it) == tx)
- {
- flag = 1;
- break;
- }
- }
- }
- else
- {
- it = q[tx].find(ty);
- if(it != q[tx].end())
- flag = 1;
- for(it = q[tx].begin(); !flag &&it != q[tx].end(); it++)
- {
- if(fin(*it) == ty)
- {
- flag = 1;
- break;
- }
- }
- }
- if(flag)
- puts("NO");
- else
- {
- puts("YES");
- unio(tx,ty);
- }
- }
- else
- {
- if(tx == ty)
- puts("NO");
- else
- {
- puts("YES");
- q[tx].insert(ty);
- q[ty].insert(tx);
- }
- }
- }
- return 0;
- }
51 nod 1515 明辨是非(并查集合并)的更多相关文章
- 51 nod 1427 文明 (并查集 + 树的直径)
1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...
- 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 1456 小K的技术(强连通 + 并查集)
1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...
- 51nod 1515:明辨是非 并查集合并
1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...
- 51 nod 1439 互质对(Moblus容斥)
1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...
- 51 nod 1394 1394 差和问题(线段树)
1394 差和问题基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个多重集合S(即里面元素可以有重复),初始状态下有n个元素,对他进行如下操作: 1.向S里面添 ...
随机推荐
- C语言第九次作业
一.PTA实验作业 题目1:统计大于等于平均分人数 1. 本题PTA提交列表 2.设计思路 float i为循环变量,sum=0,count=0来表示所求人数 float *p=s来储存首地址 for ...
- 冲刺NO.2
Alpha冲刺第二天 站立式会议 项目进展 团队成员在确定了所需技术之后,开始学习相关技术的使用,其中包括了HTML5,CSS与SSH框架等开发技术.并且在项目分工配合加以总结和完善,对现有发现的关于 ...
- SWFUpload文件上传详解
SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大. SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏览器 ...
- python的模块和包
==模块== python语言的组织结构层次: 包->模块->代码文件->类->函数->代码块 什么是模块呢 可以把模块理解为一个代码文件的封装,这是比类更高一级的封装层 ...
- lamp环境搭建经验总结
环境:centos6.4,13个源码包:参考教程高罗峰细说php思路:1.首先确定gcc,g++的安装,因为这是c语言的编译工具,没有它,源码不可能安装,redhat的yum需要配置,分为本地源和网络 ...
- Python扩展模块——selenium的使用(定位、下载文件等)
想全面的使用selenium可以下载<selenium 2自动化测试实战-基于Python语言>PDF的电子书看看 我使用到了简单的浏览器操作,下载文件等功能... 推荐使用firefox ...
- mingw打dll ,lib包命令和调用
1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...
- maven多环境部署
1.首先在maven的pom.xml文件中添加profiles标签,然后分别添加3个不同环境的profile, 本例中添加了dev.test.product三个环境,这个可以根据自己的需要添加和减少. ...
- 批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令
最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大 ...
- LXC学习实践(3)快速体验第一个容器
1.搭建第一个 LXC 虚拟计算机 #yum install lxc* 2.安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令 #lxc-checkconfig #l ...