QOJ #6342. Security Guard
首先考虑解决 \(Q=0,m=n-1\) 的情况怎么计算答案,考虑从小到大加入每个点,可以归纳说明某个时刻能同时到达点 \(x\) 上的警卫数是 \(x\) 所在联通块的最大值,则加入一条连接 \(x,y\) 的边时的权值为 \(w_x+w_y\) 减去 \(x\) 所在联通块点权最大值(不妨假设 \(w_x<w_y\))。因为除了最大值点,每个点恰会作为“联通块点权最大值”一次,所以后面部分的权值是确定的,每条边的权值是 \(w_x+w_y\),依照这个跑 MST 可以通过 \(Q=0\) 的部分。
对于 \(Q>0\) 的部分,只会新增连接最小值点(不妨记作 \(s\))和某个点的边,那么这相当于一个最小度限制生成树问题。
假设度限制为 \(k\),则转化为除了 \(s\) 之外要选一个生成森林,恰好有 \(k\) 个联通块,且每个联通块内选择一个点的点权加入答案。
先跑一个除了 \(s\) 的最小生成树 \(T\) 出来,假设 \(x,y\) 两个点的点权被选择,则在 \(T\) 上 \(x\to y\) 的路径中要选一条边去掉,显然是选择最大的边。这时我们反着考虑去掉某条边时会让哪个点的点权计算入答案,从小到大加边考虑,则可以得出计算入答案的点权是这条边连接的两个联通块的点权最小值的较大值。选择让答案增量前 \(k\) 小的边加入即可。
同时我们发现上述算法可以直接求出 \(k=1\dots n\) 的答案,因此就做完了,时间复杂度 \(O(n\log n)\)。