虽然你作为艺术品大盗的日子早已过去,但这并不意味着你对当代艺术失去了兴趣。不幸的是,你最近忙于 BOI 的筹备工作,以至于忘记了 $N$ 个最热门的当代艺术收藏品(编号从 $1$ 到 $N$)按价值的排名。由于直接询问他人会非常尴尬,你不得不采取其他手段:匿名在线排名。
也就是说,你将反复执行以下操作:首先猜测一个 $N$ 个艺术收藏品的排名(基于它们的价值,最昂贵的排在最前面),然后在某个网站上发布这个排名,最后等待收藏品所有者在评论区中的投诉。由于你不想阅读每一条评论,你只会记录你收到的投诉总数。幸运的是,所有者的行为非常可靠:对于你猜测的排名中,每一个排名高于其真实排名的收藏品,其所有者都会投诉一次,尽管该收藏品在真实排名中并没有那么高;但如果收藏品的排名被你错误地猜低了,则不会有所有者投诉。你可以假设所有收藏品的价值都是不同的。
然而,由于发布排名会危及你的匿名性,你希望在找到正确的收藏品排名之前,最多只发布 $4\,000$ 次猜测排名。编写一个程序来帮助你决定发布哪些排名!
交互
这是一个交互式任务。你必须实现函数 void solve(int N),其中 $N$ 如上所述。对于每个测试用例,该函数会被调用恰好一次。在 solve 内部,你可以使用评测机提供的以下其他函数:
int publish(std::vector<int> R):在网站上发布一个收藏品排名 $R$。$R$ 必须是 $1$ 到 $N$ 的一个排列,并将你猜测价值更高的收藏品排在前面。该函数返回发布此排名后你收到的投诉数量。每个测试用例中,你最多可以调用此函数 $4\,000$ 次。void answer(std::vector<int> R):声明你已经找到了正确的收藏品排名 $R$,格式与publish相同。你必须恰好调用一次answer;之后你的程序将自动终止。
如果你的任何函数调用不满足上述约束,你的程序将立即终止,并被判定为“不正确”(Not correct)。你不得向标准输出写入内容或从标准输入读取内容;否则你可能会收到“安全违规”(Security violation!)的判决。
你必须在源代码中包含文件 art.h。为了在本地测试你的程序,你可以将其与 sample_grader.cpp 链接,该文件可以在 CMS 中此任务的附件中找到(参见下文关于样例评测机的描述,并查看 sample_grader.cpp 以获取关于如何将其与你的程序一起运行的说明)。附件中还包含一个示例实现 art_sample.cpp。
数据范围
我们始终有 $2 \le N \le 4\,000$。
- 子任务 1(5 分):$N \le 6$
- 子任务 2(15 分):$N \le 40$
- 子任务 3(15 分):$N \le 250$
- 子任务 4(15 分):$N \le 444$
- 子任务 5(20 分):$N \le 2\,000$
- 子任务 6(30 分):无额外限制。
样例
考虑一个 $N = 3$ 的测试用例,其中收藏品 $1$ 最昂贵,其次是 $3$,收藏品 $2$ 最便宜。首先,评测机调用你的函数 solve 为 solve(3)。然后,你的程序与评测机之间可能的交互如下:
| 你的程序 | 返回值 | 说明 |
|---|---|---|
publish({1, 2, 3}) |
$1$ | 你收到来自收藏品 $3$ 所有者的一条投诉 |
publish({2, 3, 1}) |
$3$ | 你收到来自收藏品 $1$ 所有者和收藏品 $3$ 所有者的投诉 |
answer({1, 3, 2}) |
— | 你确信已经找到了正确的排名 |
你的解决方案是正确的并被接受。
评测机
样例评测机首先在标准输入中期望两行。第一行应包含整数 $N$。第二行应包含一个由 $N$ 个空格分隔的整数组成的列表,即收藏品的正确排名,格式与 publish 和 answer 相同。然后,评测机调用 solve(N) 并将你的程序调用的所有评测机函数协议写入标准输出。终止时,它会将以下消息之一写入标准输出:
Invalid input.:输入到评测机的标准输入不符合上述格式。Invalid published ranking.:你调用publish时使用了无效参数。Too many published rankings.:你调用publish的次数超过了 $4\,000$ 次。No answer.:函数solve终止时没有调用answer。Wrong answer.:你调用answer时使用了错误的排名。Correct: p published ranking(s).:你调用answer时使用了正确的排名,且调用了 $p$ 次publish。
相比之下,实际用于评判你程序的评测机只会输出 Not correct(针对上述任何错误)或 Correct。样例评测机和用于评判你程序的评测机都会在发生上述任何错误时,或在你的程序调用 answer 后,自动终止你的程序。