Codeforces 1364E X-OR
Description
这是一道交互题。
有一个 的排列 ,下标为 ,每次询问 ? a b (要求 )返回 的值。在不超过 次询问后回答排列 ,回答方式为 ! p1 p2 ... pn。
Solution
下面规范书写使用 来表示位或, 表示题目中的询问 ? x y。
首先,可以发现 ,这意味着,只要把排列里面的 的位置找出来了,就可以把它分别和其他位置询问,来得到这个排列。
几个结论:
因为 ,所以不存在其它的数 比 小。换句话说,如果有 ,则 必然不是 (下面简称「结论 1」)。
因为 ,如果 ,则必然有 。也就是说,如果存在一个数 ,使得 ,则 不可能是 。(下面简称「结论 2」)。
问题的关键出在了怎么找到 所在的位置。
首先,我们可以把 打乱顺序(开始信仰了),记作 ;存答案的排列记作 (也就是题目中的 )。 的下标是 , 的下标是 。
比方说,我们有两个 位置的候选选项 和 (),且它们的或和是已知的(即已知 ),现在我们枚举到了 这个位置,我们发起询问 ,尝试用 去更新 和 :
1. 如果 ,也就是 ,根据结论 1,可知 所在的位置不可能是 ,所以 。
2. 如果 ,也就是 ,根据结论 1,可知 所在的位置不可能是 ,故不用更新。
3. 如果 ,也就是 ,因为 肯定是不等于 的,根据结论 2,可知 所在的位置不可能是 ,所以 。
全部更新完后,我们就得到了两个 的候选项 和 ,我们开始随机选择 ,在保证 的前提下,每次询问 和 ,如果 ,根据结论 1 就可以舍去其中一个(留下结果较小的那个),即确定了 的位置。
最后就可以快乐地和每个位置询问得出答案啦!
下面分析询问次数:
最终求答案肯定是 级别次询问,第一步也肯定对于每个位置至少做了一次询问,所以总共做了 级别次询问。现在不能确定次数的就是第一步的情况 3 和第二步,通过大量尝试可知,询问次数非常少,最坏情况下仅仅十几而已,感性上可以理解为恰好选取一个数 包含了 的所有位的概率显然是十分小的,所以在随机情况下不会超过限制次数。有严谨证明可以联系我。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <bits/stdc++.h> using namespace std; const int N = (1 << 11) + 5; int n, p[N], ans[N]; inline int query( int x, int y) { cout << "? " << x << ' ' << y << endl; cout.flush(); int res; cin >> res; return res; } int main() { srand (20050910); cin >> n; for ( int i = 0; i < n; i++) p[i] = i + 1; random_shuffle(p, p + n); int a = p[0], b = p[1], val = query(p[0], p[1]); for ( int i = 2; i < n; i++) { int tmp = query(b, p[i]); if (tmp < val) { a = p[i]; val = tmp; } else if (tmp == val) { b = p[i]; val = query(a, p[i]); } } int id0; while (1) { int i = rand () % n + 1; if (i == a || i == b) continue ; int t1 = query(i, a), t2 = query(i, b); if (t1 == t2) continue ; id0 = t1 < t2 ? a : b; break ; } for ( int i = 1; i <= n; i++) if (i != id0) ans[i] = query(i, id0); cout << "! " ; for ( int i = 1; i <= n; i++) cout << ans[i] << ' ' ; cout << endl; cout.flush(); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探