P15586 [KTSC 2026] 五万酱汁 / 50,000 Sauces
题目背景
提交注意事项:
1. **不要**引入头文件。
2. 在文件头加入
```cpp
#include
int query(std::vector);
```
3. 使用 $\texttt{C++\,\red{20/23}}$ 提交。
题目描述
**这是一道交互题。本题中,交互库是非自适应的。**
给定正整数 $N$。
有一个隐藏的集族 $X$。$X$ 的每个元素 $S$ 都是 $\{0,1,\ldots,N-1\}$ 的子集。这里,$|S|$ 是 $2$ 或 $3$。注意,根据定义,集合不能包含重复元素。
你可以进行若干次以下的询问,目标是找出 $|X|$:
> **询问**
>
> 给定 $Y\subseteq \{0,1,\ldots, N-1\}$ 满足 $|Y|\le \lceil \frac{N}{2} \rceil + 1$。
>
>
> 交互库回答 $f(Y)=|\{S\in X \mid S \subseteq Y \}|$。
用尽量少的询问次数找出 $|X|$。
### 实现细节
**这是一道函数式交互题**。你不必,也不应实现 `main` 函数。
你应当实现以下的函数:
```cpp
int solve(int N)
```
- 返回 $|X|$。
- 该函数被调用恰好一次。
你可以调用以下的函数:
```cpp
int query(vector Y)
```
- $Y$ 中的元素必须两两不同。
- 必须有 $0\le Y[i]\le N-1$。
- 必须有 $|Y|\le \lceil \frac{N}{2} \rceil + 1$。
- 该函数返回 $f(Y)=|\{S\in X \mid S \subseteq Y \}|$。
- 每个测试点中,该函数最多可调用 $3\,000$ 次。
你的源代码中不应调用任何输入/输出函数。
输入格式
示例评测程序的输入格式如下:
* 第 $1$ 行:$N$
* 第 $2$ 行:$K (= |X|)$
* 对于每个 $0 \le i < K$:
* 第 $3 + i$ 行:$L$ $a_0$ $a_1$ ... $a_{L-1}$
* $2 \le L \le 3$
* $0 \le a_j \le N - 1$
* $a_0, a_1, \ldots, a_{L-1}$ 各不相同。
* $\{a_0, a_1, \ldots, a_{L-1}\}$ 是集合 $X$ 的一个元素。
输出格式
示例评测程序按以下格式输出你的代码在 `solve` 函数中返回的值以及调用 `query` 的次数:
* 第 $1$ 行:`solve` 函数返回的值 $x$
* 第 $2$ 行:调用 `query` 的次数 $Q$
说明/提示
### 数据范围
- $6\le N\le 1\, 000$;
- $1\le |X|\le 50\, 000$;
- 对于任意 $S\in X$,$|S|\in \{2,3\}$;
- 交互库是非自适应的。换言之,$X$ 在调用 `solve` 前已固定。
### 子任务
| 编号 | 得分 | $N\le $ | 特殊性质 |
| :-: | :-: | :-: | :-: |
| $1$ | $11$ | $500$ | $\text{AB}$ |
| $2$ | $32$ | $500$ | $\text{A}$ |
| $3$ | $25$ | $1\, 000$ | $\text{B}$ |
| $4$ | $32$ | $1\, 000$ | |
- 特殊性质 $\text{A}$:对于任意两个不同的 $S_i,S_j\in X$,$S_i\cap S_j=\varnothing$;
- 特殊性质 $\text{B}$:对于任意 $S\in X$,$|S|=2$。
### 计分方式
在每个子任务中,若有回答 $|X|$ 错误的情况,该子任务得 $0$ 分。
否则,令 $Q$ 为该子任务各测试点中调用 `query` 函数次数的最大值,按照如下规则计算得分:
- 对于子任务 $1,2$,若 $Q\le 3\, 000$,得满分。
- 对于子任务 $3,4$:
- 若 $41\lt Q\le 3\, 000$,得 $\displaystyle (0.5 + \frac{41}{2Q})$ 倍子任务满分;
- 若 $Q\le 41$,得满分。
### 样例
$N = 6$,$X = \{\{0,1\}, \{2,3,4\}\}$。$|X| = 2$。
询问集合的最大大小为 $\lfloor 6/2 \rfloor + 1 = 4$。
评测程序最初调用以下函数:
```cpp
solve(6)
```
选手的代码可能会进行如下交互:
```cpp
query(0, 1, 2)
query(2, 3, 4)
query(0, 2, 3, 5)
```
* 由于 $\{0, 1\} \subseteq \{0, 1, 2\}$ 且 $\{2, 3, 4\} \not\subseteq \{0, 1, 2\}$,`query(0, 1, 2)` 返回 $1$。
* 由于 $\{0, 1\} \not\subseteq \{2, 3, 4\}$ 且 $\{2, 3, 4\} \subseteq \{2, 3, 4\}$,`query(2, 3, 4)` 返回 $1$。
* 由于 $\{0, 2, 3, 5\}$ 不包含 $X$ 的任何元素,`query(0, 2, 3, 5)` 返回 $0$。
选手的代码通过将 $2$ 作为 `solve(6)` 的返回值来提交答案。