JOISC2016 H 回转寿司
看到题解里面没有较为详细的证明,对萌新极其不友好。于是有了这篇题解。
给出长为 \(n\) 的环,环上的点有点权 \(a_i\)。\(q\) 次询问,每次给出一个区间 \([l,r]\) 和数 \(A\)(因为是环所以 \(l\) 可以 \(>r\))。执行:
for(int i=l;i<=r;++i){ if(a[i]>A){ swap(A,a[i]); } }输出最后 \(A\) 的值。询问不相互独立,即
swap操作会真的发生。\(n\le 4\times 10^5\),\(q\le 2.5\times 10^4\)。
先要证明几个引理:
Ⅰ - \(A\ge\max\limits_{i=l}^ra_i\) 时,区间和 \(A\) 都不会发生改变。
证明
因为不会进行任何交换操作。
Ⅱ - 除 Ⅰ 的情况外,对某个区间进行操作后,\(A\) 会变成区间的最大值。
证明
因为 \(A\) 本身 \(<\max\limits_{i=l}^ra_i\),与之前较小的数交换后,仍 \(<\max\limits_{i=l}^ra_i\)。因此会与最大值进行交换。在此之后不会进行任何交换操作。
Ⅲ - 区间内被交换的数构成了一个极长的上升子序列,且交换后会整体右移一位,第一位变成原来的 \(A\),最后一位消失。
证明
因为若当前数被交换,则下一个数必须大于当前数。且一个数先与 \(A\) 交换,再与下一个数交换,相当于移动到了下一个数的位置。第一位与原来的 \(A\) 进行了交换,最后一位是序列最大值,不会进行更多的交换操作。
Ⅳ - 若有多个 \(A\) 对区间进行操作,区间的变化与操作顺序无关。
证明
考虑交换相邻的两个操作。操作数相等则无影响。操作数不同时,则考虑小的操作数 \(x\) 先操作与大的操作数 \(y\) 先操作。
首先,若没有另一个数进行操作,则 \(y\) 操作时的极长上升子序列必然是 \(x\) 操作时的极长上升子序列的子序列。

浙公网安备 33010602011771号