题意
给你一个长度为 n 的序列,有 m 次询问,每次有五个参数 [l r k x y]。
表示区间 [l,r] 单独拿出来,做 k 次冒泡排序后,区间 [x,y] 的和。
做法
参考 Zaunese。
pjudge 提供的做法是枚举一个阈值然后转成 0/1
序列,个人觉得不好理解。
我们模拟两组数据:
2 7 9 8 5 3 4 1 6 1 | 2 7 8 5 3 4 1 6 1 | 9 2 7 5 3 4 1 6 1 | 8 9 2 5 3 4 1 6 1 | 7 8 9 2 3 4 1 5 1 | 6 7 8 9 2 3 1 4 1 | 5 6 7 8 9 2 1 3 1 | 4 5 6 7 8 9 1 2 1 | 3 4 5 6 7 8 9 1 1 | 2 3 4 5 6 7 8 9 1 | 1 2 3 4 5 6 7 8 9
--------------------------------------------
2 9 3 6 1 8 2 7 | 2 3 6 1 8 2 7 | 9 2 3 1 6 2 7 | 8 9 2 1 3 2 6 | 7 8 9 1 2 2 3 | 6 7 8 9 1 2 2 | 3 6 7 8 9 1 2 | 2 3 6 7 8 9 1 | 2 2 3 6 7 8 9
|
发现了 xk+1 x1 x2 … xk (x1,x2,…,xk≤xk+1)
会变成 x1 x2 … xk xk+1 。
这启示我们可以尝试从前缀寻找关系(对于询问的区间 [x,y] ,可以视为 [1,y]−[1,x−1])。
对于一次操作,我们尝试考虑前缀 [1,i] 进行一次 冒泡操作
的变成的串。
Hint 1
如果一段进行了冒泡的极长子串 xk+1 x1 x2 … xk 所对应的 aj aj+1 … aj+k 满足 j+k≤i ,那么这段前缀的 sum 不会被影响。
证明:所有冒泡影响的操作均在 [1,i] 中进行,当然没有影响。
Hint 2
如果一段进行了冒泡的极长子串 xk+1 x1 x2 … xk 所对应的 aj aj+1 … aj+k 满足 j+k>i ,那么这段前缀的 sum 会变成区间 [1,i+1] 的前 i 小的值的和。
证明:我们对 j+k=i+1 与 j+k>i+1 分别进行证明。
首先经过一次冒泡排序后前缀 [1,i] 会变为 a1 a2 … aj+1 aj+2 … aj+k aj
(注意此时的 ak 表示的是值,不是下标为 k 的元素。此时的定义与下面不同)。
因为 aj+k<aj(注意此时的 ak 表示的是下标为 k 的元素,不是值),所以前缀 [1,i] 的 sum 是区间 [1,i+1] 的前 i 小的值的和。
此时有 max{a1,a2,…,aj+k}>ai+1, aj=max{a1,a2,…,aj+k}。
反证即可,如下:
若 max{a1,a2,…,aj+k}≤ai+1 ,则与 j+k>i 矛盾,故 max{a1,a2,…,aj+k}>ai+1。
若 aj=max{a1,a2,…,aj+k} ,则值为 max{a1,a2,…,aj+k} 的,在区间 [1,i] 最右边的一个元素会一直冒泡移动至 i+1。
与此时 xk+1 x1 x2 … xk 是极长子串矛盾。
综上,前缀 [1,i] 的 sum 会变成区间 [1,i+1] 的前 i 小的值的和。
我们尝试把 Hint 2
推广至 l (注意字母) 次冒泡排序后的结果。
结论:前缀 [1,i] 的 sum 在经历 l 次冒泡操作后,会变成 [1,i+l] 的前 i 小的值的和。
考虑对前缀 [i,1] 进行归纳。
-
当 l=1 时,上所述以证明。
-
当 l=l′+1 时,我们对于一段进行了冒泡的极长子串 xk+1 x1 x2 … xk 分类讨论:
为了方便,设 xk+1 x1 x2 … xk 在原序列中对应 aj aj+1 … aj+k(不保证 j+k≤i) 。
-
当 j+k≤i 时,所有操作均在前缀 [1,i] 内进行,对区间 [1,i] 的 sum 不会产生影响。
特殊的,当 j+k=i 时,因为这段子串是极长的,所以有 aj+k≤ai+1 ,仍不会对前缀 [1,i] 的 sum 不会产生影响。
-
否则有 j+k>i 。此时会把 max{a1,a2,…,aj+k+l−1} 从前缀 [1,i] 的 sum 中减去,并加入 aj+k+l。
此时前缀 [1,i] 的 sum 变为前缀 [1,i+l] 的前 i 小的值的和。
综上所述,前缀 [1,i] 的 sum 在经历 l (注意字母) 次冒泡操作后,会变成 [1,i+l] 的前 i 小的值的和。
我去我在说什么啊自己都要看不懂了。
重新口胡一下:
注意到前缀 [1,i] 进行一次 冒泡操作
会把 [1,i+1] 中的最大值移除,加入 ai+1。
即 ret=ret−max{a1,a2,…,ai,ai+1}+ai+1
猜想一下即可。
AC#764696。