CF2210E Binary Strings are Simple?
题目描述
本题为交互题。
你被给定了一个未知的二进制字符串 $s$,长度为 $n$。定义函数 $f(l, r)$ 为如下操作后数组 $a$ 中不同元素的个数:
- 令 $S$ 为子串 $s_l s_{l+1} \ldots s_r$,子串长度为 $m$。
- 开始时数组 $a$ 为空。
- 对 $S$ 的每一次 $i$ 次左循环移位($0 \leq i < m$),定义其逆序对数为 $x_{i}$。
- 对每个 $i$,将 $x_{i} \bmod m$ 添加到数组 $a$ 中,这里 $u \bmod v$ 表示 $u$ 除以 $v$ 的余数。
你可以通过发起询问来确定 $s$。每次询问,你可以选定两个整数 $l$ 和 $r$($1 \leq l \leq r \leq n$),询问 $f(l, r)$ 的值。每次询问的代价为 $\dfrac{n}{r-l+1}$。注意代价不一定是整数。
你需要用不超过 $\mathbf{max(30,3\cdot n)}$ 的总询问代价确定隐藏的二进制字符串。你最多可以猜测 $2$ 次。
$^{\text{∗}}$ 二进制字符串只包含字符 $0$ 和 $1$。
$^{\text{†}}$ 设字符串 $s = s_{1}s_{2}\cdots s_{n}$。$s$ 的第 $k$ 次左循环移位定义为 $t_{k} = s_{k+1}s_{k+2}\cdots s_{n}s_{1}s_{2}\cdots s_{k}$。
$^{\text{‡}}$ 设字符串 $s = s_{1}s_{2}\cdots s_{n}$。$s$ 的逆序对数定义为满足 $1 \leq i < j \leq n$ 且 $s_{i} > s_{j}$ 的 $(i, j)$ 对数。
输入格式
每组测例包含多组数据。第一行为测例数 $t$($1 \leq t \leq 100$)。每组测例描述如下:
每组测例第一行是一个整数 $n$($2 \leq n \leq 3000$),表示未知字符串 $s$ 的长度。
保证所有测例中 $n$ 的总和不超过 $3000$。
# 交互说明
若要发起查询,请输出如下格式的一行(不带引号):
- $\texttt{"? l r"}$($1 \leq l \leq r \leq n$)
裁判将返回一个整数 $f(l,r)$。
当你猜测字符串 $s$(长度为 $n$)时,输出如下格式的一行(不带引号):
- $\texttt{"! s"}$
若猜测正确,裁判将返回 $\texttt{1}$;否则返回 $\texttt{0}$。
猜测字符串不计算为查询。
如果你的猜测正确,则进行下一组数据,若已是最后一组,则程序结束。
交互器**非自适应**,即 $s$ 的答案在你询问前就已确定,并不会随你的提问发生变化。
每次输出查询或猜测语句后,**必须换行并刷新输出**。否则你将因“程序空闲超限”被判为无效。
如任何交互步骤读取到 $-1$ 而不是有效数据,你应立即退出程序。这表示你的查询无效或其他错误。若未立即退出,可能因对已关闭的流继续操作导致任意结果。
$^{\text{∗}}$ 刷新输出方式如下:
- C++:`fflush(stdout)` 或 `cout.flush()`
- Python:`sys.stdout.flush()`
- 其它语言请查阅文档。
输出格式
(与输入格式一致,根据交互要求发起询问或给出答案,每次操作后请输出换行并刷新输出。)
说明/提示
在例交互中,输入和输出间有空行以对齐交互器响应。实际交互输入输出中,这些空行不会出现。
第一组数据中,隐藏字符串为 $s=00000$。由于全为 0 不会产生逆序对,任意子串的 $a$ 始终为 $[0]$,因此所有 $f(l, r)$ 的返回值均为 $1$。
此例中共发起了 $3$ 次查询:
- 首次查询 $f(1,5)$,返回 $1$,查询代价 $= \dfrac{5}{5-1+1}=1$。
- 第二次查询 $f(2,5)$,返回 $1$,查询代价 $= \dfrac{5}{5-2+1}=\dfrac{5}{4}$。
- 第三次查询 $f(3,5)$,返回 $1$,查询代价 $= \dfrac{5}{5-3+1}=\dfrac{5}{3}$。
总询问代价 $= 1 + \dfrac{5}{4} + \dfrac{5}{3} = \dfrac{47}{12}$,小于 $\max(30, 3 \cdot n) = 30$。
之后我们猜测 $s=00000$,交互器返回 $1$,表示猜测正确,进行下一组数据。
第二组数据,隐藏串为 $s=001$。
我们询问 $f(1,3)$,返回 $3$。查询代价 $= \dfrac{3}{3-1+1}=1$。
总查询代价为 $1$,小于 $\max(30, 3 \cdot n)=30$。
然后我们猜测 $100$,交互器返回 $0$,表示猜测错误。
再猜测 $001$,交互器返回 $1$,表示猜测正确,进入下一组数据。
第三组数据,隐藏串为 $s=10101010$。
由 ChatGPT 5 翻译