首先可能会想到 k = 1 的情况,也就是用线段树维护,记录某个区间靠右边的最大值,靠左边的最大值以及答案和区间和,这样的话才可以有足够的信息在线段树中合并两个区间
对于两个区间,它们合并之后的新区间靠左边的最大值有两种可能,一是原先左边的区间靠左的最大值,二是原先左边的区间的和加上右边区间靠左边的最大值,另外两个部分也是相同的,这样的话一次询问是 $\Theta(\log n)$ 的
那么,回到原题之后,要求选择 k 个不相交的子段,也会想到用线段树直接维护 k 个这样的东西然后 $\Theta(k^2\log n)$ 维护,但是这题肯定是过不了的
但是,看到这题选出一个最大子区间,会想到一种最长路的做法,也就是建立一个源、一个汇,源向所有点连边权为 0 的边,所有点向汇连边权为自身边权的边,然后每个点向右边的一个点连一条自身边权的边,最后源向汇连一条边权为 0 的边(不取任何区间的时候),然后跑最长路
考虑这都有什么操作,一个是增广,一次增广也就是找一段最大的子段,然后是要支持退流,也就等于把找到的最大子段整段权值变为相反数,这样的话前一个操作刚刚的线段树已经有了,至于后面一个操作,因为是线段树,可以直接加上区间取相反数的支持,然后这题复杂度就变为 $\Theta(km\log n)$ 了