《算法艺术与信息学竞赛》之 并查集 猴子

题目描述

有N只猴子,第一只尾巴挂在树上,剩下的N-1只,要么被其他的猴子抓住,要么抓住了其他的猴子,要么两者均有。当然一只猴子最多抓两只另外的猴子。现在给出这N只猴子抓与被抓的信息,并且在某个时刻可能某只猴子会放掉它其中一只手的猴子,导致某些猴子落地。求每只猴子落地的时间。

输入输出格式

输入格式:
第一行两个数N、M,表示有N只猴子,并且总时间为M-1。接下来N行,描述了每只猴子的信息,每行两个数,分别表示这只猴子左手和右手抓的猴子的编号,如果是-1,表示该猴子那只手没抓其他猴子。再接下来M行,按时间顺序给出了一些猴子放手的信息,第1+N+i行表示第i-1时刻某只猴子的放手信息,信息以两个数给出,前者表示放手的猴子编号,后者表示其放的是哪只手,1左2右。

【数据规模】

30%的数据,N≤1000,M≤1000;

100%的数据,1≤N≤200000,1≤M≤400000。

输出格式:
共输出N行,第i行表示第i只猴子掉落的时刻,若第i只猴子岛M-1时刻以后还没掉落,就输出-1。

这道题本来应该很久之前写的,但是当时写完后有点问题debug很久,最后因为机房在修而源代码丢失,还找不到地方交,后来发现洛谷上竟然有,题号是1653,上面的第一篇题解和书上的思路是一样的,来讲讲思路吧。
因为猴子在不断的松手,这相当于将一个集合不断的分开,显然并查集是不存在这种操作的,所以我们看似无法用并查集。实际上这也是这道题的巧妙所在,我们要将“时光倒流”,将猴子不断的从地上拉到书上去,故按照输入顺序,先将所有后连的边都拆掉,然后按逆向时间顺序将其连上做并查集。但是注意一点显然我们的猴子连上树是在其从地上到并入集合中的那一瞬间,所以我们每个猴子的落地时间必须是其最晚的并入集合的时间。我们要将一个集合中的元素全部赋值为一个值,所以我们需要一个操作,但是每次重复的扫描会耗费大量时间所以我觉得在dfs便利是最好是打上标记。
代码大家可以看看洛谷上的题解,我的代码丢失就不发了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值