二分
首先有一个比较明显的性质,直径最多经过两条边。
设全局最小值为 $m$。考虑从任意一点 $u$ 出发,经过全局最小值所在的点,然后再到任意点,花费是 $2\times m$ 的。而任意边权 $\geq m$,走两条后的权值必定 $\geq 2\times m$。所以最多就是花费 $2\times m$ 走两条边,不然只走一条。
然后考虑 $l,r$ 相距越远,它们之间的那条边越小,所以考虑最远点的时候只需考虑相邻两点就行了。
而相邻两点 $i-1,i$ 的最短距离为 $\min{a_{i-1},a_{i},2\times m}$。
所以直径 $D=\max\limits_{i\in[2,n]}{\min{a_{i-1},a_{i},2\times m}}$。
考虑这是一个最大值套最小值这种形式,上二分答案。
设当前判断使用 $\leq k$ 次操作是否能使答案为 $mid$。
首先如果 $2\times m<mid$,那么无论如何都可以通过全局最小走到任意点,所以先把 $2\times a_i< mid$ 的位置全部置为 $10^9$。
然后现在只需考虑 $\max\limits_{i\in [2,n]} {\min{a_{i-1},a_i}}$ 了。
发现只需要有一个 $\min{a_{i-1},a_{i}}\geq mid$ 即可。
所以如果已经满足无需操作,否则如果存在 $a_i\geq mid$,改掉与他相邻的其中一个即可,否则需要改两个。
判一下操作次数是否 $\leq k$ 返回即可。
复杂度 $O(n\log W)$,$W$ 是值域。
代码:
1 | #include<cstdio> |

