China Final 2016 C 题瞎扯淡
周末去上海大学的 ACM/ICPC China Final,新的一赛季也结束了,出了个 “Mr. Panda and Strips” 直接身败名裂(一个奇怪的梗:我怀疑出 C 这个题的人啊,他不会做题啊?(x
大概不会补其它题的题解了暂时(看情况吧。。。
这破题出的刚想出 idea 的时候一群人讨论了下,finalize 了一个 的做法,大致的思路是枚举第一个区间的左右边界 和 ,然后去维护第二个区间,对于第二个区间,我们维护一个区间的集合 ,我们把区间内的元素表示成三元组 ,表示如果第二段区间的起点 是处于 这个区间内的话,它可以向右延伸的右边界就是 ,也就是说,对于确定了 的情况下,最后的答案应该是
我们考虑增加 (双指针),当 增加 的时候,你会发现,有一些区间包含了数字 ,那么我们要考虑把这些区间拆成多个区间,对于一个区间 ,如果存在 使得 的话,我们就把它拆掉。我们令 ,对于小于 的来说,我们可以拆成一个区间 ,对于大于 的来说,我们可以拆成区间 。那么,当我们 增加的时候,我们逐个地去看所有满足条件的 ,维护一个 ordered set 去查找包含 的区间,对于每个 ,有且只有一个对应的需要拆分的区间(注意一点就是集合 中的区间,, 和 都是严格递增的,而且没有 交集)。
这样搞一搞就 了?啊,什么?你觉得这样不优美,那么这里不优美的地方在哪啊!还不是要用 ordered set 去找要拆的区间么!那我反过来做 ( 从大到小枚举)是不是就变成了区间合并问题了?那么区间合并问题是不是就是并查集合并省下一个 了?
那么,我们就把 从大到小枚举吧。。。首先我们先来算两个数组的值
- 一个是 , 表示大于 并且 的最小的位置 。
- 另外一个是 , 表示对于 条件下 的最大的位置 。
当我们 变小的时候,就会有两个(只会有两个)区间发生了合并,大概上就是区间 和 被修改成了区间 和区间 。如果我们枚举 的时候是从大到小的话,这里 应该就等于 了,对于 来说,我们考虑先预处理出 里面可以向右扩展的最大距离(这里其实就是 的最小值),那么 就可以通过 数组和现在有大于 的最小的不能选位置 (在第一段中出现过),还有数组 ,来更新答案。
对于这个合并的做法,我们可以直接利用并查集维护 这个集合,然后并查集的值存 就可以表示区间 了。总体复杂度 。