#P7805. [JOI Open 2021] Monster Game

[JOI Open 2021] Monster Game

题目背景

本题为交互题。

交互库与 spj 提供者

https://www.luogu.com.cn/user/705620

请不要在代码中加入头文件 monster.h,在 Solve 函数前加上 extern "C",开头加上 extern "C" bool Query(int,int); 即可。

警告:滥用本题评测将被封号!

题目描述

你圈养了 NN 只书虫,这 NN 只书虫编号为 0N10 \sim N-1,第 ii 只书虫的力量值为 SiS_i,满足 Si[0,N1]S_i \in [0,N-1],且没有两只书虫的力量值是相等的。

你可以调用最多 2500025000 次「打架事件」:

  • 选择两只编号不相同的书虫 a,ba,b
    • 如果 SaSb=1|S_a-S_b|=1,则力量值小的书虫获胜;
    • 如果 SaSb>1|S_a-S_b|>1,则力量值大的书虫获胜。

请最小化调用「打架事件」的次数,你可以得到每次「打架事件」的结果,求所有书虫的力量值。

交互格式

你的程序需要实现以下函数:

  • std::vector<int> Solve(int N)
    • 对于每组数据,该函数只能被调用一次;
    • NN:书虫的个数;
    • 该函数返回这 NN 只书虫的力量值数组 TT
    • 应该满足 T=N|T|=N,否则您的程序将会被判为 Wrong Answer [1]
    • 应该满足 Ti[0,N1]T_i\in [0,N-1],否则您的程序将会被判为 Wrong Answer [2]
    • 应该满足 Ti=SiT_i=S_i,否则您的程序将会被判为 Wrong Answer [3]

你的程序可以调用以下函数:

  • bool Query(int a, int b)
    • 你可以用这个函数调用「打架事件」;
    • a,ba,b:书虫 aa 与书虫 bb 打架;
    • 如果 aa 获胜了,则返回 true 否则返回 false
    • 应该满足 a[0,N1]b[0,N1]a \in [0,N-1]\land b \in [0,N-1],否则您的程序将会被判为 Wrong Answer [4]
    • 应该满足 aba \ne b,否则您的程序将会被判为 Wrong Answer [5]
    • 调用 Query 函数应该不超过 2500025000 次。否则您的程序将会被判为 Wrong Answer [6]

特殊说明

  1. 您的程序可以调用其他标准库里的函数,或者使用全局变量;
  2. 您的程序不得使用标准输入与标准输出。

输入格式

见「交互格式」。

输出格式

见「交互格式」。

5
3 1 4 2 0

提示

样例 1 解释

样例的交互过程:

调用 返回 调用 返回
Solve(5)
Query(1, 0) false
Query(4, 0)
Query(1, 3) true
[3, 1, 4, 2, 0]

评测程序示例(样例)

评测程序示例以如下格式读取输⼊数据:

第一行:NN
第二行:S0 S1  SN1S_0\ S_1\ \cdots\ S_{N-1}

评测程序示例以如下格式读取输出数据:

当程序成功结束运行后,样例交互器会在标准输出中输出以下内容:

  • 如果你的程序被判为正确,样例交互器会输出类似 Accepted: 100 的信息,其中 100100 为你的程序调用 Query 函数的次数;
  • 如果你的程序被判为错误,样例交互器的输出内容已在「交互格式」中描述。

如果你的程序有多数错误,样例交互器只会判断其中的一种。

注意,交互器在某些数据中是自适应性的,也就是实际的交互器刚开始并没有一个确定的答案,而是会随着之前 Query 函数的调用逐渐做出响应,能保证至少有一组答案满足交互库做出的响应。

(本来原题有一个工具可以用来检测,但是找不到检测文件了,所以就咕掉了)

数据规模与约定

本题采用捆绑测试。

  • Subtask 1(10 pts):N200N \le 200
  • Subtask 2(15 pts):实际使用的交互库并不是自适应性的;
  • Subtask 3(75 pts):无特殊限制。

对于 100%100\% 的数据:

  • 4N10004 \le N \le 1000
  • 0SiN10 \le S_i \le N-1
  • SiS_i 保证互不相同。

对于 Subtask 3,特有一套评分标准:

如果你的程序通过了所有测试数据,那:

  • XX 为 Subtask 3 中你的程序对每个测试点调用的 Query 函数的次数的最大值;
  • 你的分数将按照下面的过程计算:
    • 如果 104<X2.5×10410^4<X \le 2.5 \times 10^4,你将得到 $\left\lfloor75 \times \dfrac{2.5 \times 10^4-X}{1.5 \times 10^4}\right\rfloor$ 分;
    • 如果 X104X \le 10^4,你将得到 7575 分。

说明

翻译自 JOI 2020 / 2021 Open Contest C Monster Game