C
有 \(N\) 人站在一条数轴上。他们人手一个烟花,每人手中的烟花都恰好能燃烧 \(T\) 秒。每个烟花只能被点燃一次。开始时,只有 \(K\) 号的烟花开始燃烧,当两人位置重叠且其中一人手中的烟花燃着时,另一人手中的烟花就可以被点燃。求至少需要以多快的速度跑,才能使所有人的烟花都曾被点燃。\(N\le 10^5\)。
很明显的二分答案,考虑如何检验答案,设速度为 \(v\)。
首先我们考虑令 \(K\) 点为参照物,每次相当于让左边或右边的人全部以 \(2v\) 的速度靠近,另一边不动。
每当有人碰到了 \(K\),就使当前燃烧时间加上 \(T\)。我们有一个简单地贪心,每次选一个最近的人走过来。
当然这是假做法,如果我们走向了一个最近的人,其收益为负,导致我们不能走回去,就是错的。
每个人的收益可以看做是:\(T\) 减去走过去的耗时。我们每次向左或向右拓展一个,使当前的时间非负。
将问题模型化了之后解决便很简单了,暴力 dp 是其中一个方式。
一个区间合法的条件也就是总收益非负,我们要找一条 \([k,k]\) 到 \([1,n]\) 的路径使得每个区间都合法。
考虑将区间合法的条件写出来:也就是 \(X_r-X_l\ge (r-l)T\),那么令 \(a_i=X_i-ri\),使 \(a_r-a_l\ge 0\)。
贪心让 \(a_l\) 尽量小,\(a_r\) 尽量大,从 \([k,k]\) 开始,最后可以得到一个区间使得 \(a_{l-1}>a_l,a_{r+1}<a_r\)。
那么我们无法在拓展了,考虑此时进行时光倒流,从 \([1,n]\) 开始,显然最后还是可以得到 \(a_l,a_r\)。
若在所有拓展的时刻,都有 \(a_r\ge a_l\),那么当前二分的答案合法。
启示是时间倒流在优化一些贪心题时非常有用。其他的我也说不出什么,只能先记录这个题。
D
树有边权,\(q\) 次询问每次问选出 \(k\) 条路径,必须覆盖某个点,路径并权值最大值。\(n,q,k,\le 5e5\)。
可以证明:\(k\) 条路径可以覆盖一个叶子数为 \(2k\) 的树,类比虚树的建立。
即我们选出 \(2k\) 个叶子,使得其组成的虚树边权和最大。
再考虑:每次询问中,一定存在一种方案使得直径的两端中至少有一端被选取。
那么我们以两个直径端点为根,每次询问在两棵树中分别查询即可。
那么现在相当于选 \(2k-1\) 个叶子,考虑长链剖分,然后选权值前 \(2k-1\) 大的若干长链即可。
考虑不经过 \(x\) 的情况,取出 \(x\) 子树内最深的点 \(y\),有两种情况。
第一种是把选了的第 \(2k-1\) 长的链换成 \(y\) 结尾的长链;
第二种是选 \(y\) 往上走,把最近的长链下半部分换成到 \(y\) 的路径,这个随便做了。
这个题考察了树的直径;以及长链剖分经典套路。