JZOJ – 5794 旅行
Time Limit : 1500ms
Memory Limit : 128MB
Description
悠悠岁月,不知不觉,距那传说中的 晋级泡泡帝已是过 去数十年。数十年中,这颗泡泡树上,也是再度变得精彩,各种泡泡天才辈出,惊艳世人,然而,似乎 不论后人如何的出彩,在他们的头顶之上,依然是有着一道身影而立。 泡泡帝, 。 现在, 即将带着被自己收服的无数个泡泡怪前往下一个 空间,而在前往下一个空间的道路上,有 个中转站,和M条空间虫洞连接中转站(双向通道,可有重边,可有环),然而,通过虫洞 是要一定的条件的,pppfish将手下所有泡泡怪编号为 , + ,对于每个空间虫洞,有两个值L和R,表示此虫洞只允许编号从 到 的泡泡怪通过, 现在在 号中转站,他想带尽可能多的泡 泡怪到达N号中转站,于是 找到了机智的你,希望你告诉 他最多可以带多少个泡泡怪,同时他还想知道所 有泡泡怪的编号(若有多组解取字典序最小的一组)
Input
第一行两个用空格隔开的整数 , (, ) 接下来 行,每行四个用空格隔开的整数 ,,, 表示在 , 中转站间有一个空间虫洞允许编号 的泡泡怪通过。(,,)
Output
第一行一个整数 ,表示最多能携带的泡泡怪数量 接下来一行 个用空格隔开的正整数,表示泡泡怪的编号,从小到大依次输出,如果没有泡泡怪能通过只要输出 就可以了
Sample Input
Case 1
Case 2
Sample Output
Case 1
Case 2
Data Constraint
30%的数据
100%的数据 ,
解题思路
先想到一种做法,对于每一个可能的 ,我们枚举得到到一个 ,dfs判断图是否联通,得到答案。
然后发现 可以通过二分的方法枚举,降低复杂度
这样可以得到 30pts Time Limit Exceeded 的好(暴力)成绩
如果不考虑二分,那么 的枚举就会变成连续的,我们可以不对每一个 都跑一遍dfs,而是可以用并查集维护图是否联通。
我们将边存入结构体中,并copy一份,一份以 从小到大排序,一份以 从大到小排序。
还是从小到大枚举 ,然后初始化并查集。在以 从大到小枚举边,如果一条边的允许通过的左端点 小于等于 ,我们将两个点在并查集中加入一起,只到 和 联通。
求出 作为他们的 ,如果 比之前大(不能取等,因为字典序要最小),更新答案。
算法时间复杂度
代码