luogu#P7848. 「JZOI-2」填问卷

「JZOI-2」填问卷

题目背景

团员们满脑子都是办周年庆,但小僖只想摸鱼。

于是小僖打开了他心爱的游戏。

题目描述

玩了这么久这款游戏了,今天小僖想参加活动,填一下问卷来看看自己对这款游戏的了解程度。

问卷上一共有 nn 道判断题,可怜的小僖发现自己一题也不会,他决定问一下他的队友来解决。

他的队友是游戏的一位资深用户,他全部题都会做,所以小僖决定向队友求助。具体的,小僖每次都会以以下格式询问:

int ask(int m,vector<int> w,vector<bool> ans)

其中 mm 表示这一次询问的题目的总数,wiw_i 表示询问的第 ii 题的题目编号(你需要保证单次询问的 wiw_i 互不相同,毕竟队友很没有耐心),ansians_i 表示小 X 认为的第 ii 题的正确答案(0i<m0\le i<m)。队友会告诉他这次他有多少题答对了。

例如,现在有三道题,如果答案分别是 {0,1,1}\{0,1,1\},小 XX 现在调用 ask(2,[1,3],[1,1]),那么返回值为 11,因为第一道题答错了,第三道题答对了。

由于题目有点多,小僖需要你写一个程序来帮助他得到所有题的正确答案。

你不需要实现主函数,你现在只需要实现 vector<bool> work(int n),返回值是题目 1n1\sim n 的答案,考虑到 vector<bool> 下标从 0 开始,所以你需要将你的答案数组左移 1 位。

当然,询问很费劲,所以小僖希望询问次数越少越好,询问次数的评分标准会在提示说明中给出。另外,虽然每一次询问的题目数没有限制,但你还是要注意,如果询问题目数过多,你可能会获得 TLE,题目保证每次询问的时间复杂度是 O(m)O(m) 的。

为了方便,这里用 11 表示选对,00 表述选错。

输入格式

样例数据属于第一部分,按照以下格式输入:
na1...nn\\a_{1...n}
其中 aia_i 表示第 ii 题的正确答案。

输出格式

下面给出grader.cpp的错误信息 Wrong[x]\text{Wrong[x]}

  1. 询问中的 wiw_i 大于 nn 或小于 11
  2. 询问中出现了相同的 wiw_i
  3. 询问中 mmwwansans 的长度不匹配。
  4. 答案错误或返回数组格式不正确。

之后,grader.cpp会返回你的询问次数。

3
0 0 1
2

提示

样例解释

下面给出一种 22 次的可行的询问方案

ask(1,[2],0),返回值为 11,表明第二题的答案是 00.
ask(2,[1,3],[0,1]),返回值为 22这也许是因为运气太好,一蒙就对,所以可以得出第一题和第三题的答案分别是0,10,1
于是你可以返回 {0,0,1}\{0,0,1\} 了,这时询问次数为 22

当然,如果第二次询问结果是 11,那么你就不能直接得出答案了,所以,蒙题有风险。

数据范围

对于所有数据,保证 n217n\le2^{17}

问卷的出题人为了保证用户们答题的质量,为了防止用户做判断题一蒙全对,他会精心构造每一道题的答案。

当然,这里保证答案在问卷出好后就已经存在,不会根据你的询问来构造。

对于每组数据假设你询问了 QQ 次,下面给出评分标准。 | QQ 的取值范围 | 得分 | | :----------: | :----------: | | (217,+)(2^{17},+\infty) | 00 | | 2172^{17} | 1010 | | (64000,217)(64000,2^{17}) | $\min(90,\lfloor\frac{2^{17}-Q}{2^{16}}\times100\rfloor)$ | | (63000,64000](63000,64000] | 9595 | | [0,63000][0,63000] | 100100 |

注意,本题有多组测试点,得分取所有数据中测出的得分最少的那组数据。

实现细节:请务必加上 extern "C",你可以选择补全 problem.cpp 中的函数中的内容,当然也可以自己实现。编译的时候直接编译和运行 grader.cpp 即可。

温馨提示:如果你的乱搞做法打得太劣,虽然你的询问次数小于 2172^{17},但你的得分可能小于 1010 分。