zoukankan      html  css  js  c++  java
  • 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) 为中心点进行操作 。

    证毕。

  • 相关阅读:
    描述一下Spring Bean的生命周期
    BeanFactory和ApplicationContext有什么区别
    谈谈你对AOP的理解
    谈谈对IOC的理解
    线程池中线程复用原理
    线程池中阻塞队列的最用?为什么是先添加队列而不是先创建最大线程
    为什么使用线程池?解释下线程池参数
    去噪声论文阅读
    怎么使用有三AI完成系统性学习
    JavaCnn项目注解
  • 原文地址:https://www.cnblogs.com/With-penguin/p/14002250.html
Copyright © 2011-2022 走看看