给定数组 a_1,...,a_N 在数组中依次选出一个元素构成排列 b_1,...,b_N 。定义 T = \sum _{i=1} ^N i \times b_i 。现在给出 Q 个操作,每个操作有两个数 x 和 y 表示将 a_x 替换成 y ,对于每一个操作求出操作后的 T 的最大值,每次操作后数组还原成原样。
思路
不难发现, T 的最大值是将 a 排序后得到的 \sum _{i=1} ^N i \times b_i ,因此,我们可以先将 a 的元素赋给 b ,然后 sort(b) ,记 P_{a_i} 表示 a 数组排序 a_i 后所在位置下标,并算出不进行操作时的最大值,用变量 sum 储存。
接下来考虑操作时的 T 变化情况。以样例一的第三次操作举例:
先用二分找到新插入的 y 在数组 b 中应该在的位置,记 pos=upper_bound(b, y) 。注意一定要用 upper_bound 而不是 lower_bound 不然找到的下标不一致!!(也就是无论 b 中之前有没有 y 这个元素,我们都要找到从左往右第一个严格大于 y 的元素下标)
操作后:
可以发现,此时的 T 比原来减少了 a_x \times P_{a_x} 也正是被替换掉的元素 a_x 乘 a_x 在 b 中的下标。
此时再把 P_{a_x} 以后的元素向左移动一个下标(不包括 P_{a_x} ),也就是将 T 减去 P_{a_x} 以后的数的和,这里用前缀和数组 s 优化后 T 就比原来小了 s_n - s_{P_{a_x}} :
那么如何计算把新加入的元素 y 插入 pos 后 T 的变化呢?很简单,首先把 y 插入后的 T 的值求出来, T 比原来大了 y \times pos █ 但是一定要注意,如果 pos 在 P_{a_x} 右边(不包含 P_{a_x} ) T 就要变大 y \times (pos-1) ,因为 P_{a_x} 被删掉后, pos 一定也会向左平移一个下标!!!