1515 明辨是非
题目来源: 原创
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

给n组操作,每组操作形式为x y p。

当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等;否则输出NO,并忽略此次操作。

当p为0时,如果第x变量和第y个变量可以不相等,则输出YES,并限制他们不相等 ;否则输出NO,并忽略此次操作。

Input
  1. 输入一个数n表示操作的次数(n<=1*10^5)
  2. 接下来n行每行三个数x,y,px,y<=1*10^8,p=0 or 1
Output
  1. 对于n行操作,分别输出nYES或者NO
Input示例
  1. 3
  2. 1 2 1
  3. 1 3 1
  4. 2 3 0
Output示例
  1. YES
  2. YES
  3. NO
  1. /*
  2. 51 nod 1515 明辨是非(并查集合并)
  3.  
  4. problem:
  5. 两种操作:
  6. x y 1: 如果第x,第y个数可以相同,则输出YES,并令他们相同. 否则输出NO
  7. x y 0: 如果第x,第y个数可以不相同 ......
  8.  
  9. solve:
  10. 相同可以用并查集来维护. 但是不同则不行, 如果a,b不同, b,c不同.但是a,c可以相同. 开始脑子抽了都用并查集 卒...
  11. 先set记录一下每个数与其不同的数有哪些. 然后判断两个数是否不相等时直接进行查找.并要判断他们各自所在的并查集
  12. 合并的时候再把set处理一下就好. printf一直TL,换成putsAC.
  13.  
  14. hhh-2016/09/04-17:18:40
  15. */
  16. #pragma comment(linker,"/STACK:124000000,124000000")
  17. #include <algorithm>
  18. #include <iostream>
  19. #include <cstdlib>
  20. #include <cstdio>
  21. #include <cstring>
  22. #include <vector>
  23. #include <math.h>
  24. #include <queue>
  25. #include <set>
  26. #include <map>
  27. #define lson i<<1
  28. #define rson i<<1|1
  29. #define ll long long
  30. #define clr(a,b) memset(a,b,sizeof(a))
  31. #define scanfi(a) scanf("%d",&a)
  32. #define scanfs(a) scanf("%s",a)
  33. #define scanfl(a) scanf("%I64d",&a)
  34. #define scanfd(a) scanf("%lf",&a)
  35. #define key_val ch[ch[root][1]][0]
  36. #define eps 1e-7
  37. #define inf 0x3f3f3f3f3f3f3f3f
  38. using namespace std;
  39. const ll mod = 1000000007;
  40. const int maxn = 200010;
  41. const double PI = acos(-1.0);
  42. struct node
  43. {
  44. int x,y,kind;
  45. } qry[maxn];
  46. int id[maxn];
  47. set<int>q[maxn];
  48. map<int,int> mp;
  49. set<int>::iterator it;
  50. int par[maxn];
  51.  
  52. int fin(int x)
  53. {
  54. if(par[x] == x) return x;
  55. return par[x] = fin(par[x]);
  56. }
  57.  
  58. void unio(int x,int y)
  59. {
  60. if(x == y)
  61. return ;
  62. if(q[x].size() > q[y].size())
  63. {
  64. int t = x;
  65. x = y;
  66. y = t ;
  67. }
  68. par[x] = y;
  69. for(it = q[x].begin(); it != q[x].end(); it++)
  70. {
  71. q[y].insert(*it);
  72. }
  73. }
  74.  
  75. int main()
  76. {
  77. // freopen("in.txt","r",stdin);
  78. // freopen("out.txt","w",stdout);
  79. int n;
  80. scanfi(n);
  81. int cnt = 0;
  82. for(int i = 1; i <= n; i++)
  83. {
  84. par[i] = i;
  85. scanfi(qry[i].x),scanfi(qry[i].y);
  86. scanfi(qry[i].kind);
  87. id[cnt++] = qry[i].x,id[cnt++] = qry[i].y;
  88. }
  89. sort(id,id+cnt);
  90. int total = unique(id,id+cnt)-id;
  91. for(int i = 0; i < total; i++)
  92. mp[id[i]] = i;
  93. // cout << total <<endl;
  94. // for(int i = 0;i <= total;i++)
  95. // cout <<id[i] <<" " ;
  96. // cout <<endl;
  97. for(int i =1 ; i <= n; i++)
  98. {
  99. // cout << qry[i].x <<" " <<qry[i].y << " "<<qry[i].kind <<endl;
  100. int x = mp[qry[i].x];
  101. int y = mp[qry[i].y];
  102. int tx = fin(x),ty = fin(y),flag =0;
  103. if(qry[i].kind == 1)
  104. {
  105. // cout << x <<" " <<y <<endl;
  106. if(q[tx].size() > q[ty].size())
  107. {
  108. it = q[ty].find(tx);
  109. if(it != q[ty].end())
  110. flag = 1;
  111. for(it = q[ty].begin(); !flag && it != q[ty].end(); it++)
  112. {
  113. if(fin(*it) == tx)
  114. {
  115. flag = 1;
  116. break;
  117. }
  118. }
  119. }
  120. else
  121. {
  122. it = q[tx].find(ty);
  123. if(it != q[tx].end())
  124. flag = 1;
  125. for(it = q[tx].begin(); !flag &&it != q[tx].end(); it++)
  126. {
  127. if(fin(*it) == ty)
  128. {
  129. flag = 1;
  130. break;
  131. }
  132. }
  133. }
  134. if(flag)
  135. puts("NO");
  136. else
  137. {
  138. puts("YES");
  139. unio(tx,ty);
  140. }
  141. }
  142. else
  143. {
  144. if(tx == ty)
  145. puts("NO");
  146. else
  147. {
  148. puts("YES");
  149. q[tx].insert(ty);
  150. q[ty].insert(tx);
  151. }
  152. }
  153. }
  154.  
  155. return 0;
  156. }

  

51 nod 1515 明辨是非(并查集合并)的更多相关文章

  1. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   安德鲁在玩一个叫“文明”的游戏.大妈正在帮助他. 这个游 ...

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

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

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

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

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

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

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

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

  6. 51 nod 1456 小K的技术(强连通 + 并查集)

    1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...

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

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

  8. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  9. 51 nod 1394 1394 差和问题(线段树)

    1394 差和问题基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个多重集合S(即里面元素可以有重复),初始状态下有n个元素,对他进行如下操作: 1.向S里面添 ...

随机推荐

  1. C语言第九次作业

    一.PTA实验作业 题目1:统计大于等于平均分人数 1. 本题PTA提交列表 2.设计思路 float i为循环变量,sum=0,count=0来表示所求人数 float *p=s来储存首地址 for ...

  2. 冲刺NO.2

    Alpha冲刺第二天 站立式会议 项目进展 团队成员在确定了所需技术之后,开始学习相关技术的使用,其中包括了HTML5,CSS与SSH框架等开发技术.并且在项目分工配合加以总结和完善,对现有发现的关于 ...

  3. SWFUpload文件上传详解

    SWFUpload是一个flash和js相结合而成的文件上传插件,其功能非常强大. SWFUpload的特点: 1.用flash进行上传,页面无刷新,且可自定义Flash按钮的样式; 2.可以在浏览器 ...

  4. python的模块和包

    ==模块== python语言的组织结构层次: 包->模块->代码文件->类->函数->代码块 什么是模块呢 可以把模块理解为一个代码文件的封装,这是比类更高一级的封装层 ...

  5. lamp环境搭建经验总结

    环境:centos6.4,13个源码包:参考教程高罗峰细说php思路:1.首先确定gcc,g++的安装,因为这是c语言的编译工具,没有它,源码不可能安装,redhat的yum需要配置,分为本地源和网络 ...

  6. Python扩展模块——selenium的使用(定位、下载文件等)

    想全面的使用selenium可以下载<selenium 2自动化测试实战-基于Python语言>PDF的电子书看看 我使用到了简单的浏览器操作,下载文件等功能... 推荐使用firefox ...

  7. mingw打dll ,lib包命令和调用

    1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...

  8. maven多环境部署

    1.首先在maven的pom.xml文件中添加profiles标签,然后分别添加3个不同环境的profile, 本例中添加了dev.test.product三个环境,这个可以根据自己的需要添加和减少. ...

  9. 批量检测GoAhead系列服务器中Digest认证方式的服务器弱口令

    最近在学习用python写爬虫工具,某天偶然发现GoAhead系列服务器的登录方式跟大多数网站不一样,不是采用POST等方法,通过查找资料发现GoAhead是一个开源(商业许可).简单.轻巧.功能强大 ...

  10. LXC学习实践(3)快速体验第一个容器

    1.搭建第一个 LXC 虚拟计算机 #yum install lxc* 2.安装软件包后要检查 Linux 发行版的内核对 LXC 的支持情况,可以使用下面命令 #lxc-checkconfig #l ...