ARC102D Revenge of BBuBBBlesort!

原题链接

先不加证明给出一个结论:被操作的点仅可能是初始序列中 (p[i] = i) 的点。

我们新建一个数组 (b[i] = (p[i] == i))。显然对于相邻且 (b) 值相等的两个位置无法进行操作,这样我们就把原序列分成了若干个 (b)(01) 交替的子串。每个子串可以单独考虑,一个子串符合条件需要满足两个条件(若所有子串都符合条件输出 (Yes),否则输出 (No)):

  1. 子串中所有 (p) 的范围在 ([l,r]) 之间((l,r) 为子串在原序列中的下标)。
  2. 子串中 (p) 数组中除去 (b[i] = 1) 的数后,最长下降子序列长度不能超过 (2)

第一个条件显然。

先证明第二个条件的必要性:若最长下降子序列长度大于 (2),则一定能找到 (x,y,z) 三个位置满足 (p[x]>p[y]>p[z]),容易发现这三个数不可能都回到自己的位置上。

充分性:发现一次交换不可能使最长下降子序列的长度增加,所以我们对于可操作的点可以随意操作,直到最长下降子序列的长度变为 (1),由于题目不需要构造,所以这道题就做完了。


最后证明一下最开始给的结论。分两种情况证明初始非 (p[i]=i) 的点不可能进行操作:

  1. 对一个不满足 (p[i]=i) 的点进行操作。操作后有 (p[i-1]<p[i]<p[i+1])
    • (p[i]<i)。则最后需要把 (p[i]) 移到左边,那么我们必然要以 (i-1) 为中心进行一次操作,那么首先要把 (p[i-1]) 换成比 (p[i]) 大的数,那么必然又要以 (i-2) 为中心进行一次操作。也就是说,如果成功的使得 (p[i-1]>p[i]) 了,随之而来的就是 (p[i-2]<p[i-1]) 的悲剧。这样一来,(p[i-2]<p[i-1]>p[i]),还是没办法进行操作,也就是最后 (p[i]) 不可能移到它该在的位置。
    • (p[i]>i) 同理。
  2. 一个点在若干次操作后 (p[i]=i)。显然这个点只可能是跟 (p[i-2])(p[i +2]) 交换得到。如果是跟 (p[i-2]) 交换得到则一定有交换后 (p[i] > p[i-1]);若是跟 (p[i+2]) 交换得到则一定有交换后 (p[i]<p[i+1])。显然无论哪种都不可能满足题目给的 (p[i-1]>p[i]>p[i-1]) 的条件。而无论哪种情况一定存在 (p[i-1]=i-1)(p[i+1]=i+1),思考一下可以发现原本 (p[i]=i) 的点是无论如何不可能被换走的。所以我们也永远不会以 (i) 为中心点进行操作 。

证毕。

原文地址:https://www.cnblogs.com/With-penguin/p/14002250.html