6717-牛逼做法

· · 题解

问题相当于求两个距离不大于 K 的数对的和的最大值。

将序列 K 个分一块,对于每个块内的最大值,钦定他们是最大值或次大值之一,然后求出他们周围 K-1 个数的最大值,用他们的和更新答案。

一开始的最大值使用单调队列求出。每次修改,只需要重新求出块内最大值,然后重新计算周围 O(1) 块的信息。使用线段树维护区间最大值即可。

时间复杂度 O(n+q\log n )

证明,我们最担心出现这样的情况:答案是相邻两个块的两个非最大值的数匹配。设他们为 a,b,所在块的分别的最大值为 c,d,有 c>a,d>b。考虑 ac 而不是 b 匹配,所以 b>cba 而不是 d 匹配,所以 a>d。矛盾。