Codeforces 1364E X-OR

Description

这是一道交互题。

有一个 0n1 的排列 p,下标为 1n,每次询问 ? a b (要求 ab)返回 papb 的值。在不超过 4269 次询问后回答排列 p,回答方式为 ! p1 p2 ... pn

3n2048

Solution

下面规范书写使用 来表示位或,Query(x,y) 表示题目中的询问 ? x y

首先,可以发现 0x=x,这意味着,只要把排列里面的 0 的位置找出来了,就可以把它分别和其他位置询问,来得到这个排列。

几个结论:

因为 yxx,所以不存在其它的数 x0x。换句话说,如果有 ax<bx,则 b 必然不是 0(下面简称「结论 1」)。

因为 0x=x,如果 ab,则必然有 a0b0。也就是说,如果存在一个数 c,使得 ab,ac=bc,则 c 不可能是 0。(下面简称「结论 2」)。


问题的关键出在了怎么找到 0 所在的位置。

首先,我们可以把 1n 打乱顺序(开始信仰了),记作 p;存答案的排列记作 ans(也就是题目中的 p)。p 的下标是 0n1ans 的下标是 1n

比方说,我们有两个 0 位置的候选选项 aba,b[1,n]),且它们的或和是已知的(即已知 val=Query(a,b)),现在我们枚举到了 pi=c 这个位置,我们发起询问 tmp=Query(a,c),尝试用 c 去更新 ab

1. 如果 tmp<val,也就是 pcpa<pbpa,根据结论 1,可知 b 所在的位置不可能是 0,所以 bc,valtmp
2. 如果 tmp>val,也就是 pcpa>pbpa,根据结论 1,可知 c 所在的位置不可能是 0,故不用更新。
3. 如果 tmp=val,也就是 pcpa=pbpa,因为 pc 肯定是不等于 pb 的,根据结论 2,可知 a 所在的位置不可能是 0,所以 ac,valQuery(b,c)

全部更新完后,我们就得到了两个 0 的候选项 ab,我们开始随机选择 c[1,n],在保证 ac,bc 的前提下,每次询问 t1=Query(a,c)t2=Query(b,c),如果 t1t2,根据结论 1 就可以舍去其中一个(留下结果较小的那个),即确定了 0 的位置。

最后就可以快乐地和每个位置询问得出答案啦!

下面分析询问次数:

最终求答案肯定是 n 级别次询问,第一步也肯定对于每个位置至少做了一次询问,所以总共做了 2n 级别次询问。现在不能确定次数的就是第一步的情况 3 和第二步,通过大量尝试可知,询问次数非常少,最坏情况下仅仅十几而已,感性上可以理解为恰好选取一个数 y 包含了 x 的所有位的概率显然是十分小的,所以在随机情况下不会超过限制次数。有严谨证明可以联系我。

posted @   syksykCCC  阅读(303)  评论(3编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示