UOJ #759. 【IOI2022】无线电信号塔
震惊,大鸽子居然把这道题给补掉了!
首先显然只要相邻两个能够相互通信,所有的信号塔就都可以相互通信。
这样的话每个被选中的信号塔就对应了一段区间,满足区间两端点都大于这个点的高度加上 \(\delta\) 。我们的目的就是选出最多的区间,满足区间两两不交。其中区间是开区间。
对于 \(D\) 相同的情况实际上已经平凡了,现在来考虑逐步增加 \(D\) ,维护区间的变化情况。
注意到一个很关键的性质:区间要么完全包含,要么不交。证明可以考虑反证,会导出循环的大于,因此矛盾。
那么实际上就可以维护了,每次扩展最早可以扩展的某个当前区间的左右端点,如果会包含一个更小的区间那么这个区间就没用了可以删除。可以发现每次扩展要么会删除一个区间,要么下次扩展会删除一个区间,因此扩展总次数是 \(O(n)\) 的。可以用主席树维护各个时刻的区间形态,就可以数某个区间内的个数了。
现在还有一个问题,就是左右端点是不需要构成一个区间的,只需要左/右有一个比它高的就好了。这也容易解决,每次在线段树上二分找到第一个满足条件的位置,然后就变成完全包含的问题了。