题解:P17854 [LBA-OI R6 B] 凌云沐雨

· · 题解

题意

有一个未知的长度为 n 的排列 A。

每次询问可以给出一个下标的有序集合 P=(p_1,p_2,p_3,\dots,p_m),交互库会取出 A_{p_1},A_{p_2},A_{p_3},\dots,A_{p_m},将它们离散化成一个长度为 m 的排列,然后返回这个排列的置换环个数。

我们需要在不超过 n-1 次询问内确定整个排列 A。

思路

设:我们已经知道了一些下标 q_1,q_2,q_3,\dots,q_k,其满足 A_{q_1}<A_{q_2}<A_{q_3}<\dots<A_{q_m}。

现在需要确定新下标为 x 的 A_x 会插入到 P=(q_1,q_2,q_3,\dots,q_k,x),即:将已知的 k 个下标按对应的值升序,再加入新下标 x; 设 A_x 是当前 P 中第 r 的小的数。 则,离散化后的 P:

(1,2,\dots,r-1,r+1,r+2,\dots,k+1,r)

置换环数量:(r-1)+1=r。

所以,交互库返回的数 c 就是 A_x 在这 k+1 个数中第几大。

算法

维护一个有序下标序列 ans(初始为 \{1\},表示目前 A_1 最小)。

然后依次加入下标 x=2,3,\dots,n:

因此,处理完后 ans 为按 A 值从小到大排列的下标序列。

所以 A_{ans_i}=i+1(0 \le i < n)。

:::info[正确性证明]

:::