JOISC2016 H 回转寿司

看到题解里面没有较为详细的证明,对萌新极其不友好。于是有了这篇题解。

洛谷

AT

  • 给出长为 \(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\) 操作时的极长上升子序列的子序列

posted @ 2023-07-27 20:33  lzyqwq  阅读(33)  评论(0)    收藏  举报