0%

CF-1073-E. Comparable Permutations(单调性的变化)

题目大意

  1. 任务目标

已知一个隐藏的长度为 nn 的排列 pp你需要找到一个字典序最小的排列 qq,使得 qq 满足以下两个条件:

  • q>pq > pqq 的字典序大于 pp

  • rev(q)>rev(p)rev(q) > rev(p)qq 翻转后的字典序大于 pp 翻转后的字典序)

注意: qq 必须是由 pp 中的元素重新排列得到的。你不需要直接输出 qq,而是输出一个下标排列 rr (1rin1 \le r_i \le n),使得 qi=priq_i = p_{r_i}。如果不存在满足条件的 qq,输出 1-1

2. 交互规则

  • 你可以进行询问,格式为 ? i j,查询 pi<pjp_i < p_j 是否成立。

  • 如果 pi<pjp_i < p_j,交互库返回 11;否则返回 00

  • 每个测试点最多允许询问 3n3n 次。

  • 交互库是非自适应的(隐藏排列 pp 在交互开始前已确定)。

3. 样例解释

  • 样例 1: p=[5,4,2,3,1]p = [5, 4, 2, 3, 1]

    • 满足条件的最小 qq[5,4,3,1,2][5, 4, 3, 1, 2]
    • 验证:qqpp 字典序大;rev(q)=[2,1,3,4,5]rev(q) = [2, 1, 3, 4, 5]rev(p)=[1,3,2,4,5]rev(p) = [1, 3, 2, 4, 5],显然 rev(q)>rev(p)rev(q) > rev(p)
    • 输出 r=[1,2,4,5,3]r = [1, 2, 4, 5, 3],因为 p1=5,p2=4,p4=3,p5=1,p3=2p_1=5, p_2=4, p_4=3, p_5=1, p_3=2
  • 样例 2: p=[3,1,2,4]p = [3, 1, 2, 4]

    • 不存在同时满足 q>pq > prev(q)>rev(p)rev(q) > rev(p) 的排列 qq,故输出 1-1

4. 数据范围

  • t1000t \le 1000n2104n \le 2 \cdot 10^4,所有测试用例的 nn 之和不超过 21042 \cdot 10^4

  • 时间限制 2 秒,内存限制 256 MB。

思路讲解

一开始看这道题目,不能看出来像下面这张图的解法,但是我们会误以为这个情况的一些其他性质比较重要,但是最重要的是单调性的变化,因为没有单调性的变化意味着没有这个答案。

因此,这道题目关键点在于这个单调性的变化(即未发生单调性变化下操作是没有意义的,一定会违反题设条件),我们先来看这个情况,不难发现,在单调性变化之后执行交换与这个反转操作最好。

image

那么如果先下降呢?经过对拍验证以及这个推理,如果先下降再上升,是无法构造出答案的。原因:设在当前点,你需要构造 qq,以满足题设条件。因此,你要提高 qq 的字典序,那么必须要在后面的点当中选一个比当前点高的(最优的是恰好高的),但是这样一来,就会导致 rev(q)\text{rev}(q) 的字典序下降(这个是无法挽救的,因为目前的更换的当前点处于上升序列,处于上升序列的其他点比当前点低,处于下降序列的其他点比当前点低),导致无法满足题设条件。

image

因此先下降,再上升的话,必须要再找一个下降。

image

然后,交换好以后,就想办法把这个上升序列插入到这个下降序列当中(有序插入,保持单调下降性),随便你用什么办法。

然后为了减少提问个数,我们使用了记忆化,就是问过的,就不再问了(注意问了 a b 的话,b a 也不要再问了)。

感觉这道题目难度主要还是在这个调试,代码和细节上。

AC代码

AC
https://codeforces.com/contest/2191/submission/359093232

心路历程(WA,TLE,MLE……)