很久以前,一只特别的老鼠试图发现一个秘密排列 $p[1] \dots p[N]$。然而,如果不使用一种名为“排列发现器”的特殊设备,它无法做到这一点。给定某个排列 $q[1] \dots q[N]$,该设备会告诉它满足 $p[i] = q[i]$ 的位置 $i$ 的数量。不过,它使用该设备的次数不能超过一定限制。
更正式地说,存在一个秘密排列 $p[1] \dots p[N]$。你可以使用操作 query(q[1] \dots q[N]),它返回满足 $p[i] = q[i]$ 的位置 $i$ 的数量。
题目描述
给定 $N$,使用足够少的查询次数,找出 $p$。
交互
这是一个交互式问题。参赛者必须实现一个函数 void solve(int N),最终找出隐藏的排列 $p$。为此,请包含头文件 grader.h,并使用函数 int query(vector<int> q)。如果给定一个排列 $q$,该函数将实现前述行为。为了回答,请使用你认为的 $p$ 作为 $q$ 进行查询。如果你是正确的,返回值当然是 $N$。在收到 query 的返回值为 $N$ 后,你必须终止 solve 函数。
数据范围
| 子任务 | 分数 | 限制 |
|---|---|---|
| 子任务 1 | 13 | $N \le 7$ |
| 子任务 2 | 38 | $N \le 50$ |
| 子任务 3 | 49 | $N \le 256$ |
说明
令 $Q$ 为测试中使用的查询次数。评分标准如下:
对于子任务 1:
- 若 $Q \le 50$,得 13 分;
- 若 $50 < Q \le 200$,得 9 分;
- 若 $200 < Q \le 5040$,得 6 分;
- 若 $Q > 5040$,得 0 分。
对于子任务 2:令 $Q' = (\lfloor Q / 100 \rfloor + 1) * 100$
- 若 $Q' \le 400$,得 38 分;
- 若 $400 < Q' \le 700$,得 $(38-29) * (700-Q') / (700-400) + 29$ 分;
- 若 $700 < Q' \le 1300$,得 $(29-21) * (1300-Q') / (1300-700) + 21$ 分;
- 若 $1300 < Q' \le 10000$,得 $(21-4) * (10000-Q') / (10000-1300) + 4$ 分;
- 若 $10000 < Q'$,得 0 分。
对于子任务 3:令 $Q'$ 同子任务 2
- 若 $Q' \le 2400$,得 49 分;
- 若 $2400 < Q' \le 5000$,得 $(49 - 29) * (5000 - Q') / (5000 - 2400) + 29$ 分;
- 若 $5000 < Q'$,得 0 分。
注意:如果找到正确排列时使用的查询次数过多,你将获得“Correct”的判定,但详细信息为“Too many queries”,且得分为 0 分。