1 条题解
-
0
自动搬运
来自洛谷,原作者为

lightup37
KfbddzCkVrGtwLDijdpgaxqbLXDIoFsz51R2zxic搬运于
2025-08-24 22:24:28,当前版本为作者最后更新于2022-01-31 11:04:56,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
IOI2020 mushrooms 题解
题意
交互题. 给定 , 有一个长度为 的 01 序列 , 你不知道 的值, 但你知道 .
我们定义一次操作为给定 和一个长度为 的, 不含重复值的序列 , 然后交互库返回 .
你需要通过若干次操作, 求出 .
具体细节参见题面.
Note: 你需要
#include "mushrooms.h".解法
为了方便, 以下我们将不加申明的将 用作上一次 操作的返回值, 读者可以根据上下文知道这个 的值.
Method 1
我们考虑朴素暴力: 对所有 执行操作 , 这是一个时间复杂度 的算法, 可以获得 ... 10 分.
Method 2
我们发现: 如果已知有 个 0, 分别是 , 那么可以执行这样的一次操作来求出长度为 的序列 中 0 的个数: $\texttt{query}(\{g_1, f_1, g_2, f_2, \cdots g_k, f_k\})$. 容易知道 $\sum\limits_{i=1}^k g_i = \lceil\frac{ret}{2}\rceil$. 有 个 1 的情况下同理.
而如何求出 呢? 显然直接套用 Method 1 即可. 我们使用类似根号分治的思想可以做到 的复杂度(实际上后续都是常数优化, 并没有超越这个复杂度.)
Optimize 1
我们考察这种操作: $\texttt{query}(\{g_1, f_1, g_2, f_2, \cdots g_k, f_k\})$. 那么可以根据 的奇偶性判断 的值, 具体来说, 由于 左右均为相同的值, 故不管这些数如何取值, 均不会影响 的奇偶性, 所以 的奇偶性只由 决定, 也即可以得出 的具体值. 于是我们可以动态的维护当前 0/1 的个数和这些 0/1 的位置然后每次启发式的用 0/1 去询问.
Optimize 2
这同时也可以对 Method 1 的过程做出优化: 在有两个相同值的数 时, 每次可以通过 确定 , 的具体值.
Optimize 3
Method 2 的过程已经难以优化, 接下来我们来优化 Method 1 的过程.
不妨考虑我们有充分多的 0 和充分多的 1, 接下来我们考虑如何更优的询问, 具体来说, 我们将用 2 询问次得到 5 个数的具体值.
我们设 为所有 0 的位置序列, 为所有 1 的位置序列. 即 必有 .
我们先进行询问 . 根据返回值讨论: 首先可以发现根据 的奇偶性确定 , 然后我们令 , 这样就有 . 显然只需要考虑 的情况.
如果 , 我们接下来进行询问 $\texttt{query}(\{q_1, y, q_2, p_1, z, p_2, u, p_3, v\})$, 然后令 (这是因为有相邻的 ).
首先考察 的奇偶性以确定 , 然后令 , 这样就有 , 也即 , 这样又可以根据 的奇偶性来确定 , 从而确定 和 .
Optimize 4
调整你的参数.
- 1
信息
- ID
- 6000
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者