#P17273. [eJOI 2026] Automata

    ID: 19750 远端评测题 2000ms 1024MiB 尝试: 0 已通过: 0 显示难度省选/NOI− 上传者: 标签>交互题Special JudgeeJOI(欧洲)2026

[eJOI 2026] Automata

题目描述

有一片由 NN 个格子排成一行的场地,从左到右编号为 00 到 N−1N-1。每个格子的高度互不相同:格子 ii 的高度为 pip_i,序列 p0,p1,…,pN−1p_0,p_1,\ldots,p_{N-1} 是 0,1,…,N−10,1,\ldots,N-1 的一个排列。

当且仅当 ∣i−j∣≤1|i-j|\le 1 时,编号为 ii 和 jj 的两个格子称为接近的。特别地,每个格子都与自身接近。

一个机器人站在场地上,初始位于某个格子。机器人可以接受以下两类命令:

  • MAX:在与机器人当前格子接近的所有格子中,机器人下一步将位于高度最大的唯一格子;
  • MIN:在与机器人当前格子接近的所有格子中,机器人下一步将位于高度最小的唯一格子。

由于格子与自身接近,一条命令执行后机器人可能仍停在原地。

一个程序是由有限条命令组成的序列,其中每条命令均为 MAX 或 MIN。若机器人从格子 XX 出发并执行程序 SS,它将停在一个唯一确定的格子,记为 result⁡(S,X)\operatorname{result}(S,X)。

你需要回答 QQ 次询问。第 ii 次询问给出一个由 KiK_i 个起始格子 x0,x1,…,xKi−1x_0,x_1,\ldots,x_{K_i-1} 组成的集合。机器人会被放在其中某个格子上,但具体是哪一个事先未知。对于每次询问,请判断是否存在一个程序,使得无论选中哪个起始格子,机器人最终都会到达同一个格子。

形式化地,你需要判断是否存在程序 SS,满足

$$\operatorname{result}(S,x_0)=\operatorname{result}(S,x_1)=\cdots=\operatorname{result}(S,x_{K_i-1}).$$

所有询问使用同一个排列 pp。

你不需要构造这样的程序,只需报告它是否存在。

实现细节

你需要实现以下两个函数:

void initialize(std::vector<int> p)
  • pp:00 到 N−1N-1 的一个排列。
bool exists_program(std::vector<int> x)
  • xx:一次询问给出的格子,按严格递增顺序排列。

函数 initialize 恰好调用一次,并且发生在所有 exists_program 调用之前。

函数 exists_program 共调用 QQ 次,每次询问调用一次。如果存在某个程序,使得机器人无论从给定的哪个格子出发,最终都会停在同一个格子,则应返回 true;否则返回 false。

输入格式

输入格式:

  • 第 11 行:两个整数 NN 和 QQ;
  • 第 22 行:NN 个整数 p0,p1,…,pN−1p_0,p_1,\ldots,p_{N-1},其中 pip_i 表示格子 ii 的高度;
  • 第 3+i3+i 行:一个整数 KiK_i,随后是 KiK_i 个整数 x0,x1,…,xKi−1x_0,x_1,\ldots,x_{K_i-1},描述第 ii 次询问。

输出格式

输出格式:

  • 第 11 行:一个长度为 QQ 的二进制串。若第 ii 次询问的答案为 true,则第 ii 个字符为 1,否则为 0。
3 3
0 2 1
2 0 2
3 0 1 2
2 1 2
111
7 3
0 4 2 1 3 5 6
3 0 1 3
3 1 3 4
2 3 6
001

提示

样例 1 解释

本例中 p=[0,2,1]p=[0,2,1]。对于第二次询问,机器人可能从格子 00、11 或 22 出发。考虑程序 [MAX][\texttt{MAX}]。

  • 若从格子 00 出发,与其接近的是格子 00 和 11。由于 p0<p1p_0<p_1,机器人移动到格子 11。
  • 若从格子 11 出发,与其接近的是格子 00、11 和 22。由于 p0<p1p_0<p_1 且 p1>p2p_1>p_2,机器人停在格子 11。
  • 若从格子 22 出发,与其接近的是格子 11 和 22。由于 p1>p2p_1>p_2,机器人移动到格子 11。

因此存在一个程序,使机器人从三个起点出发最终都停在格子 11,答案为 true。其他可行程序包括 [MIN,MAX][\texttt{MIN},\texttt{MAX}]、$[\texttt{MIN},\texttt{MIN},\texttt{MAX},\texttt{MIN},\texttt{MAX},\texttt{MIN}]$ 和 [MAX,MIN,MAX][\texttt{MAX},\texttt{MIN},\texttt{MAX}]。

样例 2 解释

本例中 p=[0,4,2,1,3,5,6]p=[0,4,2,1,3,5,6]。

对于前两次询问,不存在能让机器人从所有给定起点出发后停在同一格子的程序,因此两个答案均为 false。

对于最后一次询问,机器人可能从格子 33 或 66 出发。考虑程序 [MAX,MAX,MAX][\texttt{MAX},\texttt{MAX},\texttt{MAX}]。

  • 若从格子 33 出发,与其接近的是格子 22、33 和 44。由于 p3<p4p_3<p_4 且 p2<p4p_2<p_4,机器人移动到格子 44。类似地执行接下来的两条命令后,它最终到达格子 66。
  • 若从格子 66 出发,它会一直停在格子 66。

因此答案为 true。程序 $[\texttt{MIN},\texttt{MAX},\texttt{MAX},\texttt{MAX}]$ 也可行。相反,程序 [MAX,MAX][\texttt{MAX},\texttt{MAX}] 从格子 33 出发时会停在格子 55,从格子 66 出发时则停在格子 66。

限制

  • 3≤N≤2⋅1053\le N\le 2\cdot 10^5
  • 1≤Q≤5⋅1051\le Q\le 5\cdot 10^5
  • p0,p1,…,pN−1p_0,p_1,\ldots,p_{N-1} 是 0,1,…,N−10,1,\ldots,N-1 的一个排列
  • 2≤Ki≤N2\le K_i\le N
  • 对每次询问均有 0≤x0<x1<⋯<xKi−1<N0\le x_0<x_1<\cdots<x_{K_i-1}<N
  • 所有 QQ 次询问中 KiK_i 的总和不超过 10610^6

子任务

子任务 分值 NN QQ KiK_i 附加限制
0 - 样例。
1 3 ≤2⋅105\le 2\cdot 10^5 ≤5⋅105\le 5\cdot 10^5 =2=2 若答案为肯定,则存在恰好使用 11 条命令的可行程序。
2 7 若答案为肯定,则存在至多使用 55 条命令的可行程序。
3 9 ≤100\le 100 ≤500\le 500 -
4 17 ≤5000\le 5000 ≤5⋅105\le 5\cdot 10^5
5 7 ≤2⋅105\le 2\cdot 10^5 每次询问均有 x1=x0+1x_1=x_0+1。
6 8 ≤5000\le 5000 ≤N\le N -
7 13 ≤2⋅105\le 2\cdot 10^5 存在 0<a<b<N−10<a<b<N-1,使得 $p_0<p_1<\cdots<p_a>p_{a+1}>\cdots>p_b<p_{b+1}<\cdots<p_{N-1}$。
8 若 NN 为偶数,则 p0<p1>p2<p3>⋯<pN−1p_0<p_1>p_2<p_3>\cdots<p_{N-1};若 NN 为奇数,则 p0<p1>p2<p3>⋯>pN−1p_0<p_1>p_2<p_3>\cdots>p_{N-1}。
9 23 -