【洛谷 P1653】 猴子 (并查集)
题目链接
没删除调试输出,原地炸裂,\(80\)->\(0\)。如果你要问剩下的\(20\)呢?答:数组开小了。
这题正向删边判连通性是很不好做的,因为我们并不会并查集的逆操作。于是可以考虑把断边改成逆向连边,某个猴子什么时候和\(1\)号猴子变成连通的,这就是他掉下去的时间,如果本来就与\(1\)号猴子连通,那么它就永远不会掉下去。我用了两个并查集,一个维护连通性,一个维护答案,这两个并查集前面的操作几乎是一模一样的,同时连边,到最后一步也就是某个猴子与\(1\)号猴子变为连通时,前者正常连边,后者不连,因为我们要记录原连通块里的猴子答案是一样的。然后就\(ok\)了。
#include <cstdio>
#include <cstring>
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define Close fclose(stdin);fclose(stdout);
const int MAXN = 500010;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
return s * w;
}
int n, m;
int a[MAXN], b[MAXN], f[MAXN], ban[MAXN][3], F[MAXN];
int fall_time[MAXN], son[MAXN][3], start_set[MAXN], linked[MAXN];
int junk;
void init(){
for(int i = 1; i <= n; ++i)
f[i] = i;
}
int find(int x){
return f[x] == x ? x : f[x] = find(f[x]);
}
void merge(int x, int y){
f[find(y)] = find(x);
}
void Init(){
for(int i = 1; i <= n; ++i)
F[i] = i;
}
int Find(int x){
return F[x] == x ? x : F[x] = Find(F[x]);
}
void Merge(int x, int y){
F[Find(y)] = Find(x);
}
int main(){
Open("monkey");
memset(fall_time, -1, sizeof fall_time);
n = read(); m = read();
init(); Init();
for(int i = 1; i <= n; ++i){
son[i][1] = read(); son[i][2] = read();
}
for(int i = 1; i <= m; ++i){
a[i] = read(); b[i] = read();
ban[a[i]][b[i]] = 1;
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= 2; ++j)
if(!ban[i][j])
if(son[i][j] != -1)
merge(i, son[i][j]), Merge(i, son[i][j]);
for(int i = m; i; --i){
junk = son[a[i]][b[i]];
int fa = find(a[i]) != find(1), fb = find(junk) != find(1);
merge(a[i], junk);
if(fa && find(a[i]) == find(1))
fall_time[Find(a[i])] = i - 1;
else if(fa) Merge(a[i], junk);
if(fb && find(junk) == find(1))
fall_time[Find(junk)] = i - 1;
else if(fb) Merge(a[i], junk);
}
for(int i = 1; i <= n; ++i)
printf("%d\n", fall_time[Find(i)]);
Close;
return 0;
}
【洛谷 P1653】 猴子 (并查集)的更多相关文章
- 洛谷 P1653 猴子 解题报告
P1653 猴子 题目描述 有N只猴子,第一只尾巴挂在树上,剩下的N-1只,要么被其他的猴子抓住,要么抓住了其他的猴子,要么两者均有.当然一只猴子最多抓两只另外的猴子.现在给出这N只猴子抓与被抓的信息 ...
- 洛谷P1653 猴子
#include<bits/stdc++.h> using namespace std; inline void read(int &tmp) { ;char c=getchar( ...
- 洛谷P3295 萌萌哒 并查集 + ST表
又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...
- 洛谷P4092树——并查集
题目:https://www.luogu.org/problemnew/show/P4092 利用并查集,倒序离线,那么从倒序来看被撤销标记的点就再也不会被标记,所以用并查集跳过: 莫名其妙的WA,调 ...
- 洛谷P2391 白雪皑皑(并查集)
题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...
- 洛谷P3958 奶酪 并查集
两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...
- 洛谷 P3958 奶酪 并查集
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...
- 洛谷 P2391.白雪皑皑 (并查集,思维)
题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后 ...
- 洛谷P2024食物链——并查集补集的灵活运用
题目:https://www.luogu.org/problemnew/show/P2024 自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变. 借鉴题解后,才明 ...
随机推荐
- Web框架本质及浅谈HTTP协议
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...
- Java IO学习--File类
一.File类 File类具备一定的误导性,可能容易认为它指代的是文件,实际并非如此,它既能代表一个特定文件的名称,又能表示一个目录下一组文件的名称.简而言之,File类是文件或者目录路径名的抽象表示 ...
- LightGBM的算法介绍
LightGBM算法的特别之处 自从微软推出了LightGBM,其在工业界表现的越来越好,很多比赛的Top选手也掏出LightGBM上分.所以,本文介绍下LightGBM的特别之处. LightGBM ...
- 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 间接调用 Python 实现
现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过 ...
- Structure From Motion(SFM,从运动恢复结构)
Structure From Motion(SFM,从运动恢复结构) 阅读相关文献: Wu et al. Multicore Bundle Adjustment Agarwal et. al. Bun ...
- restFul介绍及其使用规范
什么是REST和RESTful API? REST:(英文:Representational State Transfer,简称REST)表征性状态转移,是一种软件架构风格. RESTful : RE ...
- APP与智能手表是如何通信的【本文摘抄自深圳尚锐科技】
APP与智能手表是如何通信的 1. Android 与服务器的通信方式主要有两种,一种是http 通信 ,一种是socket 通信. 两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请 ...
- CE-HTML简介
1.典型的CE-HTML代码如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html ...
- 并发(三) CountDownLatch
CountDownLatch 和CyclicBarrier的区别是,CyclicBarrier可以循环使用,CountDownLatch不可以:CyclicBarrier可以有一个Runnable参数 ...
- oracle视图就是封装了一条写好的sql语句 可通过视图修改表结构 ; oracle需要手动创建序列
create sequence student_sid; --创建序列 oracle只能通过手动方式创建序列