51nod1515 明辨是非 并查集 + set

一开始想的时候,好像两个并查集就可以做......然后突然懂了什么....
相同的并查集没有问题,不同的就不能并查集了,暴力的来个set就行了.....
合并的时候启发式合并即可做到$O(n \log^2 n)$
如果打$splay$,那么启发式合并可以做到$O(n \log n)$
#include <set>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} #define pc(o) *O ++ = o
char WR[], *O = WR;
inline void write(int opt) {
if(opt == ) pc('Y'), pc('E'), pc('S'), pc('\n');
else pc('N'), pc('O'), pc('\n');
} #define ri register int
#define sid 200050 set <int> f[sid];
int T[sid], n, tot;
int x[sid], y[sid], p[sid], fa[sid]; inline int find(int o) {
if(fa[o] == o) return o;
return fa[o] = find(fa[o]);
} int main() {
n = read();
for(ri i = ; i <= n; i ++) {
x[i] = read(); y[i] = read(); p[i] = read();
T[++ tot] = x[i]; T[++ tot] = y[i];
}
sort(T + , T + tot + );
tot = unique(T + , T + tot + ) - T - ;
for(ri i = ; i <= n; i ++) {
x[i] = lower_bound(T + , T + tot + , x[i]) - T;
y[i] = lower_bound(T + , T + tot + , y[i]) - T;
}
for(ri i = ; i <= tot; i ++) fa[i] = i;
for(ri i = ; i <= n; i ++) {
int u = find(x[i]), v = find(y[i]);
if(!p[i]) {
if(u == v) write(-);
else write(), f[u].insert(v), f[v].insert(u);
}
else {
if(u == v) write();
else if(f[u].count(v)) write(-);
else {
write();
if(f[u].size() > f[v].size()) swap(u, v); fa[u] = v;
for(set <int> :: iterator it = f[u].begin(); it != f[u].end(); it ++)
{ int w = *it; f[w].insert(v); f[v].insert(w); }
}
}
}
fwrite(WR, , O - WR, stdout);
return ;
}
51nod1515 明辨是非 并查集 + set的更多相关文章
- 51nod-1515 明辨是非——并查集
给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变量可以不相等,则输 ...
- 51nod 1515 明辨是非 [并查集+set]
今天cb巨巨突然拿题来问,感觉惊讶又开心,希望他早日康复!!坚持学acm!加油! 题目链接:51nod 1515 明辨是非 [并查集] 1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间 ...
- 51 nod 1515 明辨是非(并查集合并)
1515 明辨是非题目来源: 原创基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以 ...
- 51Nod 1515 明辨是非 —— 并查集 + 启发式合并
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1515 1515 明辨是非 题目来源: 原创 基准时间限制:1 ...
- 51nod 1515:明辨是非 并查集合并
1515 明辨是非 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 给n组操作,每组操作形式为x y p. 当p为1时,如果第x ...
- 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记录不相等的信息: 如果要求变量不 ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- 关押罪犯 and 食物链(并查集)
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...
随机推荐
- Islands and Bridges(POJ2288+状压dp+Hamilton 回路)
题目链接:http://poj.org/problem?id=2288 题目: 题意:求Hamilton 路径权值的最大值,且求出有多少条权值这么大的Hamilton路径. 思路:状压dp,dp[i] ...
- hash(2018年CSUST省赛选拔赛第一场B题+hash+字典树)
题目链接:http://csustacm.com:4803/problem/1006 题目: 思路:正如题目一样,本题是一个hash,比赛的时候用的字典树,但是不知道为什么一直RE(听学长说要动态开点 ...
- 爬虫实战--利用Scrapy爬取知乎用户信息
思路: 主要逻辑图:
- Markdown tutorial [repost]
1. italic We'll start by learning two basic elements in text formatting: italics and bold. In these ...
- html5优分期大学生分期购物商城模板
链接:http://pan.baidu.com/s/1dEUAzBz 密码:j150
- c++中指针常量,常指针,指向常量的常指针区分
const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针 const char * con ...
- virsh 命令最新整理。 每个“;”之后是正解
1,migrate --domain --destURL --dname --live(热迁移) migrate lf 192.168.16.3 dname 2,managedsave domain ...
- HDU 6187 Destroy Walls (对偶图最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6187 题意:有一个V个结点M条边的带边权无向平面图,有一个人在一个区域,要拆一些墙使得他可以到达任意一 ...
- CentOS下NTP安装配置
安装yum install ntp 配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 ...
- JavaScript 兼容性总结
请实现鼠标点击任意标签,alert该标签的名称(注意兼容性) function elementName(evt){ evt = evt|| window.event; var selected = ...