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里面添 ...
随机推荐
- 敏捷冲刺每日报告五(Java-Team)
第五天报告(10.29 周日) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- spring mvc 整合Quartz
Quartz是一个完全由java编写的开源作业调度框架.不要让作业调度这个术语吓着你.尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!Quartz整合在sp ...
- Python基于共现提取《釜山行》人物关系
Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...
- iOS开发UIKit框架-可视化编程-XIB
1. Interface Builder 可视化编程 1> 概述 GUI : 图形用户界面(Graphical User Interface, 简称GUI, 又称图形化界面) 是指采用图形方式显 ...
- XML之自动生成类,添加,修改,删除类的属性
1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHe ...
- django报错Manager isn't accessible via UserInfo instances
出现这种错误是因为调用模型对象时使用了变量名,而不是对象名(模型类),例如: user = UserInfo()user_li = user.objects.filter(uname=username ...
- Spring邮件发送2
前言:上一篇博文讲解了邮件发送的基础用法(数据是写死的),然而在实际开发中,大多数情况下邮件内容都是根据业务来动态生成的.所以在此篇博文中,我们将讲解邮件发送携带数据的几种方案. 一.解析自定义占位符 ...
- linux下的Shell编程(6)case和select
第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是: case var in pattern 1 ) - ;; pattern 2 ) - ;; ...
- c# 工具类(字符串和时间,文件)
using System; using System.IO; using System.Text.RegularExpressions; using System.Windows.Browser; n ...
- Struts(二十四):短路验证&重写实现转换验证失败时短路&非字段验证
短路验证: 若对一个字段使用多个验证器,默认情况下会执行所有的验证.若希望前面的验证器没有通过,后面的验证器就不再执行,可以使用短路验证. 1.如下拦截器,如果输入字符串,提交表单后,默认是会出现三个 ...