#P15033. [2026省选联测]将军棋
[2026省选联测]将军棋
(注意:这是一道交互题)
题目描述
generals 是同学们喜闻乐见的一款模拟养成类游戏,在游戏中,玩家需要控制自己的国家和军队,通过攻打他人的国家来占领更大的地盘,又或者是走和平路线,稳中取胜。
而在众多的自制地图中,小 H 最爱玩的就是“扁平原”了,顾名思义,“扁平原”就是一片 的空地。
初始时,由于有些关系比较要好的玩家组成了一队,而每一支队伍有一个所对应的颜色,所以,游戏初始的局面可以看作是一个长度为 的颜色序列 。
由于小 H 成为了 Supporter,所以他拥有一个外挂功能:对于给定的区间 ,小 H 可以知道其中队伍的数量,小 H 想通过这种方式来获取整个初始局面的信息。
但是,如果对服务器的请求次数过多,就会被服务器给 ban 掉,所以小 H 请你在给定的次数以内(详见数据范围),求出初始的游戏局面。
当然,由于你无法分辨队伍的编号,所以你只需要输出一个序列 ,满足 即可。
实现细节(交互与接口)
你不需要,也不应该实现主函数。
请确保你的程序开头有
#include "generals.h"
且你需要实现以下的函数:
vector<int> getColor(int T, int N, int Q);
表示该测试点编号为 T,序列长度为 N,询问次数上限为 Q,该函数应该返回一个长度为 N 的正整数序列 a,表示你的答案。你可以调用以下函数:
int query(int l, int r);
该函数接收两个参数 l 和 r,并返回一个正整数,表示区间 [l,r] 中队伍的数量,你必须保证 l <= r。
最终测试时,在每个测试点,交互库会恰好调用一次 getColor 函数,保证在满足调用次数的情况下,最终测试的交互库运行所需的时间不超过 0.1 秒,交互库本身所消耗的内存不超过 64 MiB。
在下发文件中包含一个名为 generals.cpp 的文件,其可以解决 时的情况,作为示例程序,选手可以在此基础上继续实现本题。
测试程序方式(调试说明)
本题目录下提供了交互库的参考实现 grader.cpp,其为实例交互库的源代码。最终测试时所用的交互库实现与该实现有不同,因此选手的解法不应依赖交互库的具体实现。
选手可以在本题目录下使用如下命令编译得到可执行程序:
g++ generals.cpp -c -O2 -std=c++14 -lm
g++ grader.cpp -c -O2 -std=c++14 -lm
g++ generals.o grader.o -o generals
这三条命令会编译当前 generals.cpp 和 grader.cpp 后将它们链接起来,生成可执行文件 generals。
按上述方法编译得到的可执行文件 generals,其运行方式如下:
-
可执行文件将从标准输入读入以下格式的数据:
- 第一行三个正整数
T N Q,分别表示测试点编号、序列的长度和询问次数的限制。 - 第二行
N个正整数,其中第i个正整数表示初始时第i个位置所属的队伍。
- 第一行三个正整数
-
读入之后,交互库会进行测试。如果你的程序不满足交互库限制,其会在输出中返回对应的错误信息,否则会返回所询问的次数。
选手在调试时需要保证输入可执行文件 generals 的数据满足上述输入格式,否则不保证输出结果正确。
样例与数据范围
样例 1
见选手目录下的 generals/generals 1.in。这个样例满足测试点 1~8 的条件。
样例 2
见选手目录下的 generals/generals 2.in。这个样例满足测试点 61~81 的条件。
数据范围(总体)
对于所有测试数据,保证 , 或 ,。
测试点说明(表格):
| 测试点编号 | 特殊性质 | ||
|---|---|---|---|
| 1~8 | 1000 | A | |
| 9~15 | 2000 | ||
| 16~34 | B | ||
| 35~48 | C | ||
| 49~60 | D | ||
| 61~81 | 100 | ||
| 82~100 | 1000 |
特殊性质说明:
- A:每支队伍所出现的位置均连续。
- B:队伍的数量不超过 3。
- C:队伍的数量不超过 4。
- D:队伍的数量至少为 。
注:队伍的数量指 c 中不同的数的个数。