ARC102D Revenge of BBuBBBlesort!
先不加证明给出一个结论:被操作的点仅可能是初始序列中 \(p[i] = i\) 的点。
我们新建一个数组 \(b[i] = (p[i] == i)\)。显然对于相邻且 \(b\) 值相等的两个位置无法进行操作,这样我们就把原序列分成了若干个 \(b\) 值 \(01\) 交替的子串。每个子串可以单独考虑,一个子串符合条件需要满足两个条件(若所有子串都符合条件输出 \(Yes\),否则输出 \(No\)):
- 子串中所有 \(p\) 的范围在 \([l,r]\) 之间(\(l,r\) 为子串在原序列中的下标)。
- 子串中 \(p\) 数组中除去 \(b[i] = 1\) 的数后,最长下降子序列长度不能超过 \(2\)。
第一个条件显然。
先证明第二个条件的必要性:若最长下降子序列长度大于 \(2\),则一定能找到 \(x,y,z\) 三个位置满足 \(p[x]>p[y]>p[z]\),容易发现这三个数不可能都回到自己的位置上。
充分性:发现一次交换不可能使最长下降子序列的长度增加,所以我们对于可操作的点可以随意操作,直到最长下降子序列的长度变为 \(1\),由于题目不需要构造,所以这道题就做完了。
最后证明一下最开始给的结论。分两种情况证明初始非 \(p[i]=i\) 的点不可能进行操作:
- 对一个不满足 \(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\) 同理。
- 一个点在若干次操作后 \(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\) 为中心点进行操作 。
证毕。
由于博主比较菜,所以有很多东西待学习,大部分文章会持续更新,另外如果有出错或者不周之处,欢迎大家在评论中指出!