排序后,W(v)=∑i=1k(2i−1−k)vi(把 v 从小到大排)。单点修改后这个量会变,直接重排是 O(klogk),过不了。
关键观察:一个数 x 与其余数的绝对差之和,只取决于「比它小的个数与和」「比它大的个数与和」。相等值贡献为 0。
夜场拍卖同时挂出 k 件拍品。每件拍品当前有一个整数出价,记成数组 v1,v2,…,vk。值班估价员要盯的不是单件高低,而是当前全部拍品两两出价的绝对差之和,用来衡量这一轮报价有多散。场刊规定:可以把某一件拍品的出价改成新值,也可以随时查询当前的价差总和。
对当前出价数组 v,价差总和定义为所有无序对的绝对差之和。也就是先枚举所有下标对 (p,q)(满足 1≤p<q≤k),再把 ∣vp−vq∣ 加起来:
W(v)=∣v1−v2∣+∣v1−v3∣+⋯+∣vk−1−vk∣.共有两类指令(指令编号必须是 1 或 2):
1 p y:把 vp 改成 y。2:查询当前的 W(v)。第一行一个整数 G,表示后面有多少段互不相关的场次记录。对每一段单独维护拍品出价,并按出现顺序输出该段内每一次查询的结果。全部场次的 (k+q) 之和不超过 500000。
其余约束:1 ≤ G ≤ 100000,单段 1 ≤ k,q ≤ 200000,出价与修改值的绝对值不超过 1000000000。
第一行一个整数 G(1 ≤ G ≤ 100000)。
每一段记录格式如下:
第一行两个整数 k,q(1 ≤ k,q ≤ 200000)。
第二行 k 个整数 v1,v2,…,vk(绝对值不超过 1000000000)。
接下来 q 行,每行一条指令:修改为 1 p y(1 ≤ p ≤ k,绝对值不超过 1000000000);查询为单独一个 2。
保证全部记录中 k+q 的总和不超过 500000。
对每条查询指令输出一行一个整数,即当前的 W(v)。
输入
1
3 4
0 5 2
2
1 3 9
2
1 1 5
2
输出
10
18
8
说明
初始出价为 0、5、2:
把第 3 件改成 9,变成 0、5、9:
把第 1 件改成 5,变成 5、5、9:
输入
1
2 2
7 7
2
1 2 3
2
输出
0
4
说明
两件拍品出价相同,绝对差为 0。把第二件改成 3 后,∣7−3∣=4。
本题属于以下题库,请选择所需题库进行购买
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.