#P15033. [2026省选联测]将军棋

[2026省选联测]将军棋

(注意:这是一道交互题)

题目描述

generals 是同学们喜闻乐见的一款模拟养成类游戏,在游戏中,玩家需要控制自己的国家和军队,通过攻打他人的国家来占领更大的地盘,又或者是走和平路线,稳中取胜。

而在众多的自制地图中,小 H 最爱玩的就是“扁平原”了,顾名思义,“扁平原”就是一片 1×n1\times n 的空地。

初始时,由于有些关系比较要好的玩家组成了一队,而每一支队伍有一个所对应的颜色,所以,游戏初始的局面可以看作是一个长度为 nn 的颜色序列 cc

由于小 H 成为了 Supporter,所以他拥有一个外挂功能:对于给定的区间 [l,r][l,r],小 H 可以知道其中队伍的数量,小 H 想通过这种方式来获取整个初始局面的信息。

但是,如果对服务器的请求次数过多,就会被服务器给 ban 掉,所以小 H 请你在给定的次数以内(详见数据范围),求出初始的游戏局面。

当然,由于你无法分辨队伍的编号,所以你只需要输出一个序列 aa,满足 ai=ajci=cja_i=a_j \Leftrightarrow c_i=c_j 即可。


实现细节(交互与接口)

你不需要,也不应该实现主函数。

请确保你的程序开头有

#include "generals.h"

且你需要实现以下的函数:

vector<int> getColor(int T, int N, int Q);

表示该测试点编号为 T,序列长度为 N,询问次数上限为 Q,该函数应该返回一个长度为 N正整数序列 a,表示你的答案。你可以调用以下函数:

int query(int l, int r);

该函数接收两个参数 lr,并返回一个正整数,表示区间 [l,r] 中队伍的数量,你必须保证 l <= r

最终测试时,在每个测试点,交互库会恰好调用一次 getColor 函数,保证在满足调用次数的情况下,最终测试的交互库运行所需的时间不超过 0.1 秒,交互库本身所消耗的内存不超过 64 MiB。

在下发文件中包含一个名为 generals.cpp 的文件,其可以解决 N=2,Q=1N=2,Q=1 时的情况,作为示例程序,选手可以在此基础上继续实现本题。


测试程序方式(调试说明)

本题目录下提供了交互库的参考实现 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.cppgrader.cpp 后将它们链接起来,生成可执行文件 generals

按上述方法编译得到的可执行文件 generals,其运行方式如下:

  • 可执行文件将从标准输入读入以下格式的数据:

    • 第一行三个正整数 T N Q,分别表示测试点编号、序列的长度和询问次数的限制。
    • 第二行 N 个正整数,其中第 i 个正整数表示初始时第 i 个位置所属的队伍。
  • 读入之后,交互库会进行测试。如果你的程序不满足交互库限制,其会在输出中返回对应的错误信息,否则会返回所询问的次数。

选手在调试时需要保证输入可执行文件 generals 的数据满足上述输入格式,否则不保证输出结果正确。


样例与数据范围

样例 1

见选手目录下的 generals/generals 1.in。这个样例满足测试点 1~8 的条件。

样例 2

见选手目录下的 generals/generals 2.in。这个样例满足测试点 61~81 的条件。

数据范围(总体)

对于所有测试数据,保证 2N10002\le N\le 1000Q=2000Q=200010410^41ciN1\le c_i\le N

测试点说明(表格):

测试点编号 NN\le Q=Q= 特殊性质
1~8 1000 10410^4 A
9~15 2000
16~34 B
35~48 C
49~60 D
61~81 100 10410^4
82~100 1000

特殊性质说明:

  • A:每支队伍所出现的位置均连续。
  • B:队伍的数量不超过 3。
  • C:队伍的数量不超过 4。
  • D:队伍的数量至少为 N1N-1

注:队伍的数量指 c 中不同的数的个数。