「JZOI-2」填问卷
题目背景
团员们满脑子都是办周年庆,但小僖只想摸鱼。
于是小僖打开了他心爱的游戏。
题目描述
玩了这么久这款游戏了,今天小僖想参加活动,填一下问卷来看看自己对这款游戏的了解程度。
问卷上一共有 $n$ 道判断题,可怜的小僖发现自己一题也不会,他决定问一下他的队友来解决。
他的队友是游戏的一位资深用户,他全部题都会做,所以小僖决定向队友求助。具体的,小僖每次都会以以下格式询问:
`int ask(int m,vector<int> w,vector<bool> ans)`
其中 $m$ 表示这一次询问的题目的总数,$w_i$ 表示询问的第 $i$ 题的题目编号(你需要保证单次询问的 $w_i$ 互不相同,毕竟队友很没有耐心),$ans_i$ 表示小 X 认为的第 $i$ 题的正确答案($0\le i<m$)。队友会告诉他这次他有多少题**答对**了。
例如,现在有三道题,如果答案分别是 $\{0,1,1\}$,小 $X$ 现在调用 `ask(2,[1,3],[1,1])`,那么返回值为 $1$,因为第一道题答错了,第三道题答对了。
由于题目有点多,小僖需要你写一个程序来帮助他得到所有题的正确答案。
你不需要实现主函数,你现在只需要实现 `vector<bool> work(int n)`,返回值是题目 $1\sim n$ 的答案,考虑到 `vector<bool>` **下标从 0 开始**,所以你需要将你的答案数组**左移 1 位。**
当然,询问很费劲,所以小僖希望询问次数越少越好,询问次数的评分标准会在提示说明中给出。另外,虽然每一次询问的题目数没有限制,但你还是要注意,如果询问题目数过多,你可能会获得 **TLE**,题目保证每次询问的时间复杂度是 $O(m)$ 的。
为了方便,这里用 $1$ 表示选对,$0$ 表述选错。
输入输出格式
输入格式
样例数据属于第一部分,按照以下格式输入:
$n\\a_{1...n}$
其中 $a_i$ 表示第 $i$ 题的正确答案。
输出格式
下面给出`grader.cpp`的错误信息 $\text{Wrong[x]}$:
1. 询问中的 $w_i$ 大于 $n$ 或小于 $1$。
2. 询问中出现了相同的 $w_i$。
3. 询问中 $m$ 和 $w$ 或 $ans$ 的长度不匹配。
4. 答案错误或返回数组格式不正确。
之后,`grader.cpp`会返回你的询问次数。
输入输出样例
输入样例 #1
3
0 0 1
输出样例 #1
2
说明
### 样例解释
下面给出一种 $2$ 次的可行的询问方案
`ask(1,[2],0)`,返回值为 $1$,表明第二题的答案是 $0$.
`ask(2,[1,3],[0,1])`,返回值为 $2$,~~这也许是因为运气太好,一蒙就对~~,所以可以得出第一题和第三题的答案分别是$0,1$。
于是你可以返回 $\{0,0,1\}$ 了,这时询问次数为 $2$。
当然,如果第二次询问结果是 $1$,那么你就不能直接得出答案了,所以,蒙题有风险。
### 数据范围
对于所有数据,保证 $n\le2^{17}$。
问卷的出题人为了保证用户们答题的质量,为了防止用户做判断题一蒙全对,他会精心构造每一道题的答案。
当然,这里保证答案在问卷出好后就已经存在,不会根据你的询问来构造。
对于每组数据假设你询问了 $Q$ 次,下面给出评分标准。
| $Q$ 的取值范围 | 得分 |
| :----------: | :----------: |
| $(2^{17},+\infty)$ | $0$ |
| $2^{17}$ | $10$ |
| $(64000,2^{17})$ | $\min(90,\lfloor\frac{2^{17}-Q}{2^{16}}\times100\rfloor)$ |
| $(63000,64000]$ | $95$ |
| $[0,63000]$ | $100$ |
注意,本题有多组测试点,得分取所有数据中测出的得分最少的那组数据。
实现细节:请务必加上 `extern "C"`,你可以选择补全 `problem.cpp` 中的函数中的内容,当然也可以自己实现。编译的时候直接编译和运行 `grader.cpp` 即可。
温馨提示:如果你的乱搞做法打得太劣,虽然你的询问次数小于 $2^{17}$,但你的得分可能小于 $10$ 分。