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

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

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

k=2 时,发现 1 是唯一 pi2=0 的数,其余的数总是有 2i22i+12 成对出现,当 n 为偶数时除外,此时 n2 也是单独的,但可以通过 k=n 来求出 n 的位置。

pi2=pj2(i,j) 互为匹配,区间中 pi2 只出现了一次的 i 为独立数。

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

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

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

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

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

否则剩下两个数,一个是 1,一个是值在 2n1 的独立数,称为 xx 肯定会在 [1,l1][l+2,n] 中找到自己的匹配。

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

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

于是我们在 2log2n+11=20 次询问内解决了问题。

posted @   Terac  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示