题解:P16434 [APIO 2026 中国赛区] 蛋糕

· · 题解

这里给一个 Sub4 比较简单的考场做法,只需要 N=1998,而且每次询问只需要询问常数个位置。

首先观察到 K=7 的限制其实很紧,由于一次询问的结果只有三种,而 3^K>W,3^{K-1}<W,也就是每次询问的结果都要充分利用。从信息论的角度也容易发现 K=7 是理论下界,而我们要做的就是每次将可能的情况尽可能均分为三份,并用一次询问将答案锁定在其中一份。

询问的结果与数字大小有关,于是考虑三分状物,维护 d 可能的在的区间 [l,r](初始时 l=1,r=W),取三等分点 x=l+\lceil \frac{r-l+1}{3}\rceil,y=r-\lfloor\frac{r-l+1}{3}\rfloor ,我们希望用一次询问确定 d[l,x),[x,y],(y,r] 中的哪一个,即确定 dx,y 的大小关系。

考虑到如果只着眼于和 d 相关的大小比较肯定难以利用 = 进行三分,所以应该需要利用某些数的位置来间接得到 dx,y 的大小关系。如果我们给交互库的序列包含 x,y,插入 d 之后,如果 x 的位置向右移动了,说明 d<x;否则如果 y 的位置向右移动了,d<y;如果都没有移动说明 d>y(这里没有管取不取等的问题,下面实现时注意自洽即可)。也就是说,我们只需要知道 x,y 的位置有没有移动。此时有一个很自然的构造:

z=x+y>rz 的位置一定会向右移动,查询 z+1 这个位置一定是 z。考虑查询 xy+1 两个位置上值的和与 z 的关系(即查询 S_1=\{x,y+1\},S_2=\{z+1\}):

如此,我们便以一个十分简洁的构造完成了任务。

不过此时有一个问题:可能 z>W+200,这时把 z 加到初始序列中是不被交互库允许的。解决方案很简单,只要把 S_2=\{z\} 拆成若干个数 S_2=\{p,q,r\} 满足 p+q+r=z 即可。初始序列摆烂的话可以直接取 1\sim W 的所有数,我场上不太聪明写了个搜。

:::info[代码,是偷偷拍的照片]

:::