给 n n n 个原子。每个原子有两种状态,静态和激发态。每个原子 i i i 从静态转换到激发态需要消耗 d [ i ] d[i] d[i] 的能量,而在激发态会贡献的 a [ i ] a[i] a[i] 的能量。初始的时候,序号从 1 − n 1-n 1−n 的原子是按照编号顺序连接在一起的,也就是原子 i i i 连接到原子 i + 1 i + 1 i+1。在激发原子时有一个连锁反应,就是被激发的原子会自动激发它连接的下一个原子,这个时候是不会消耗能量的。但是最后一个原子不能连接到任何一个原子。
给定 K K K,我们必须要改变 K K K 个连接关系。有一个限定是不能连接到自己,也不能连接到原来连接的原子。比如初始时,原子 a a a 连接到原子 b b b,那么我们改变这个连接关系时,原子 a a a 不能连接到原子 a a a,也不能再次连接原子 b b b。
我们可以选择激发任意多个原子,问最终能得到最大的能量是多少。
1)当 K > = 2 K>=2 K>=2 时 ①我们总是能将所有原子全部激发。我们可以选择激发前 N − 1 N-1 N−1 个原子中(因为最后一个原子不能连接到任何的原子,所以不能作为激发原子)能量消耗 d [ i ] d[i] d[i] 最小的那个原子 i i i 以激发所有的原子。这样我们的收益就是:所有原子的能量和 - 原子 i i i 能量消耗。
②我们还可以选择不改变原子的连接关系(虽然我们必须改变K次,但是我们可以改变了再改变回去哈哈哈),然后遍历激发每一个原子 i i i, 取(后缀能量和 - 当前原子消耗)的最大收益 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i])
2)当 K = = 0 K == 0 K==0 时 就只能不改变原来原子的连接关系,然后取 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i])
3)当 K = = 1 K == 1 K==1 时
第一种情况:
我们枚举断点 i i i, 断掉从点 i i i 发出的边,然后将点 i i i 连接到第一个点上(从2开始枚举,因为原子1不能连接到原子1)。然后这个原子就变成了两个部分: ① [ 1 , i ] [1, i] [1,i] 的环; ② [ i + 1 , N ] [i + 1, N] [i+1,N] 的链。
对于第一个部分,就和 K > = 2 K>=2 K>=2 时的第一种情况类似,区间能量和-最小能量消耗即可。 对于第二个部分,就和 K > = 2 K>=2 K>=2 时的第二种情况类似,直接找到 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i]) 即可。 最后的结果自然就是两个部分相加了。
第二种情况: 我们枚举断点 i i i, 断掉从点 i − 1 i - 1 i−1 连接到 i i i 的边,并且连接到 i + 1 i + 1 i+1 上。这样我们就成了一个如下图所示的样子。 这样的话我们考虑激发点在断点 i i i 前 [ 1 , i − 1 ] [1, i - 1] [1,i−1],还是在其后 [ i , N ] [i, N] [i,N]。
如果在断点后,那就很简单就是像 K > = 2 K>=2 K>=2 时的第二种情况,直接找到 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i]) 即可。
如果在断点前,我们就需要找到 [ 1 , i − 1 ] [1, i - 1] [1,i−1] 这个区间内的 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i]) ,然后减去 a [ i ] a[i] a[i]。所以我们可以用线段树维护区间的 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i]) 。这个时候需要考虑单独的结点 i i i 是不是有贡献,如果有正的贡献就加上。
最后的结果自然是激发点取断点前和断点后的最大值。
【关于为什么只间隔一个点呢,对于在断点后激发无影响。但是对于在断点前激发,那么断点后的能量和是确定的,我们对比的实际上是断点前那一段的 m a x ( s u f f i x [ i ] − d [ i ] ) max(suffix[ i ] - d[ i ]) max(suffix[i]−d[i]) 。所以去掉更多的点,显然不是更优的策略。】
对于每种情况都必须考虑不激发的情况,也就是每种情况的结果都要和 0 0 0 对比取最大值。