题解 CF1764G3 Doremy's Perfect DS Class (Hard Version)

考虑询问能给出什么信息。

当 $k=n$ 时,可以二分 $n$ 位置用 $\log_2 n$ 次询问确定 $n$ 的位置。但暂时看不出这对如何求 $1$ 的位置有什么用处。

当 $k=2$ 时,发现 $1$ 是唯一 $\left\lfloor\frac{p_i}{2}\right\rfloor=0$ 的数,其余的数总是有 $\left\lfloor\frac{2i}{2}\right\rfloor$ 和 $\left\lfloor\frac{2i+1}{2}\right\rfloor$ 成对出现,当 $n$ 为偶数时除外,此时 $\left\lfloor\frac n 2\right\rfloor$ 也是单独的,但可以通过 $k=n$ 来求出 $n$ 的位置。

称 $\left\lfloor\frac{p_i}{2}\right\rfloor=\left\lfloor\frac{p_j}{2}\right\rfloor$ 的 $(i,j)$ 互为匹配,区间中 $\left\lfloor\frac{p_i}{2}\right\rfloor$ 只出现了一次的 $i$ 为独立数。

先考虑 $n$ 为奇数的情况,可以通过询问计算出 $[l,r]$ 中的独立数个数,具体地,设询问结果为 $x$,独立数个数为 $y$,有 $y+\frac{(r-l+1-y)}{2}=x$,可得 $y=2x-(r-l+1)$。

显然 $[1,x]$ 和 $[x+1,n]$ 中,除去 $1$ 的独立数个数是相同的,故独立数多的那一个区间里一定有 $1$,可以依靠这个进行二分。总共需要 $2\log_2 n=20$ 次询问。

$n$ 为偶数时,即 $n$ 也可能是多出的独立数,只需要在左右区间独立数个数相等时,靠 $k=n$ 的询问求出独立数是在左边还是右边,再去另一边递归即可。于是我们在 $2\log_2n+1=21$ 次询问内解决了问题。仍无法通过。

考虑再优化掉一个询问,确定 $n$ 的那次询问显然是必要的,尝试优化二分的最后一个询问 $[l,l+1]$,令 $q(l,r)=query(l,r,2)$,此时已知 $q(1,l-1),q(1,l+1),q(l,n),q(l+2,n)$,可以利用这些信息。

若 $n$ 位置仍不确定,说明两数中有一数是 $n$。直接用 $1$ 次询问令 $k=n$ 来找 $n$ 即可。

否则剩下两个数,一个是 $1$,一个是值在 $2\sim n-1$ 的独立数,称为 $x$,$x$ 肯定会在 $[1,l-1]$ 或 $[l+2,n]$ 中找到自己的匹配。

  • 若 $q(1,l+1)=q(1,l-1)+1$,说明对于 $[1,l-1]$,加上 $p_l,p_{l+1}$ 后只增加了 $1$ 这个独立数,说明 $x$ 的匹配在 $[1,l-1]$ 中,再查询 $q(1,l)$,与 $q(1,l-1)$ 比对即可找到 $1$ 的位置。

  • 否则 $q(1,l+1)=q(1,l-1)+2$,$[1,l-1]$ 加上 $p_l,p_{l+1}$ 后增加了 $1$ 和 $x$ 两个独立数,说明 $x$ 的匹配在 $[l+1,n]$ 中,查询 $q(l,n)$,与 $q(l+1,n)$ 比对即可找到 $1$ 的位置。

于是我们在 $2\log_2 n+1-1=20$ 次询问内解决了问题。

posted @ 2023-09-27 12:55  Terac  阅读(21)  评论(0)    收藏  举报  来源