#lg17144. [NOI 2026] 木棉

[NOI 2026] 木棉

AdditionalFile5765.zip

#5765. 「NOI2026」木棉

标签: 传统 | 时间限制: 2000 ms | 内存限制: 1024 MiB |

题目描述

故园中的那几棵木棉,仍旧生长在小 NN 逐渐朦胧的记忆中。小 NN 对故园的记忆,可以用一个长度为 nn 的序列 [a0,a1,,an1][a_0,a_1,\ldots,a_{n-1}] 表示。

故园中的每棵木棉,都形如一棵结点有标号的无根树。小 NN 对一棵木棉的印象,可以用她的故园记忆的一个区间 [l,r)[l,r) 描述:

  • 这棵树的结点数目为 k=rl+2k=r-l+2,结点编号为 0k10\sim k-1
  • $[\min(a_l,k-1),\min(a_{l+1},k-1),\ldots,\min(a_{r-1},k-1)]$ 是这棵树的 Prüfer 序列,其中 Prüfer 序列的定义详见【提示】一节。

在回忆往事时,小 NN 也向你提出了 mm 次询问。其中第 ii (0i<m)(0\le i < m)次询问为:

  • 在故园记忆的区间 [li,ri)[l_i,r_i) 所对应的木棉上,结点 xi,yix_i,y_i 是否相邻?

实现细节

选手不需要,也不应该实现 main 函数。

选手需要确保提交的程序源文件包含头文件 kapok.h,即在程序开头加入以下代码:

#include "kapok.h"

选手需要在提交的程序源文件 kapok.cpp 中实现以下函数:

std::vector<bool> kapok(
    int c, int n, int m, std::vector<int> a, std::vector<int> l, std::vector<int> r, std::vector<int> x, std::vector<int> y
);
  • c,n,mc,n,m 分别表示测试点编号、故园记忆序列的长度、询问次数,c=0c=0 表示该测试点为样例。
  • aa 表示故园记忆序列。
  • l,rl,r 分别表示每次询问所给定的区间的两个端点。
  • x,yx,y 分别表示每次询问所给定的两个结点的编号。
  • 该函数需要返回一个长度恰好为 mm 的序列 f0,f1,,fm1f_0,f_1,\ldots,f_{m-1},其中 fif_i (0i<m)(0\le i < m) 表示第 ii 次询问的结果。
  • 对于每个测试点,该函数会被评测程序调用恰好一次。 本试题目录下的 template_kapok.cpp 是提供的示例代码,选手可参考并实现自己的代码。

测试程序方式

选手可以在本题目录下使用如下命令编译得到可执行文件:

g++ grader.cpp kapok.cpp -o kapok -O2 -std=c++14 -static

对于编译得到的可执行文件 kapok

  • 可执行文件将从标准输入读入以下格式的数据:
    • 第一行包含三个非负整数 c,n,mc,n,m
    • 第二行包含 nn 个非负整数 a0,a1,,an1a_0,a_1,\ldots,a_{n-1}
    • i+3i+3 (0i<m)(0\le i < m) 行包含四个非负整数 li,ri,xi,yil_i,r_i,x_i,y_i
  • 可执行文件将输出以下格式的数据至标准输出:
    • i+1i+1 (0i<m)(0\le i < m) 行包含一个非负整数,其中 00 表示 fif_ifalse11 表示 fif_itrue

样例 1

输入

0 8 3
2 0 2 6 0 7 2 2
0 3 0 2
3 5 1 2
0 0 0 1

输出

1
0
1
  • 区间 [0,3)[0,3) 对应的树有 55 个结点,Prüfer 序列为 [2,0,2][2,0,2],边集为 {(1,2),(0,3),(0,2),(2,4)}\{(1,2),(0,3),(0,2),(2,4)\},因此结点 0,20,2 相邻。
  • 区间 [3,5)[3,5) 对应的树有 44 个结点,Prüfer 序列为 [3,0][3,0],边集为 {(1,3),(0,2),(0,3)}\{(1,3),(0,2),(0,3)\},因此结点 1,21,2 不相邻。
  • 区间 [0,0)[0,0) 对应的树有 22 个结点,Prüfer 序列为空,唯一一条边为 (0,1)(0,1),因此结点 0,10,1 相邻。

样例 2

见选手目录下的 kapok/kapok2.inkapok/kapok2.ans

该样例满足测试点 353\sim5 的约束条件。

样例 3

见选手目录下的 kapok/kapok3.inkapok/kapok3.ans

该样例满足测试点 353\sim5 的约束条件。

数据范围

对于所有测试数据,均有:

  • 1n,m2×1051\le n,m\le2\times10^5
  • 对于所有 0i<n0\le i<n,均有 0ai<n+20\le a_i<n+2
  • 对于所有 0i<m0\le i<m,均有 0lirin0\le l_i\le r_i\le n0xi,yi<rili+20\le x_i,y_i<r_i-l_i+2
测试点编号 n,mn,m\le 特殊性质
1,21,2 500500
353\sim5 5,0005,000
6,76,7 2×1052\times 10^5 对于所有 0i<n0\le i<n,均有 ai<10a_i<10
8,98,9 对于所有 0i<n0\le i<n,均有 ai<103a_i<10^3
10,1110,11 对于所有 0i<m0\le i<m,均有 xi,yi<10x_i,y_i<10
12,1312,13 对于所有 0i<m0\le i<m,均有 xi,yi<103x_i,y_i<10^3
141614\sim16 A
171917\sim19 对于所有 0i<m0\le i<m,均有 ri=nr_i=n
202220\sim22 10510^5
232523\sim25 2×1052\times10^5

特殊性质 A:对于所有 0i<m0\le i<m,在给定 li,ril_i,r_i 后,(xi,yi)(x_i,y_i) 均从所有满足限制的有序点对中独立均匀随机生成。

提示

对于一棵结点编号为 0c10\sim c-1 (c2)(c\ge 2) 的无根树 TT

  • 依次执行 c2c-2 次操作,其中第 ii (0i<c2)(0\le i< c-2) 次操作如下:
    • 找出当前编号最小的叶子 viv_i
    • 记录其唯一相邻点的编号 pip_i
    • 然后从 TT 中删去 viv_i 及其唯一邻边。
  • 如此得到的长度为 c2c-2 的序列 [p0,p1,,pc3][p_0,p_1,\ldots,p_{c-3}],即为 TT 的 Prüfer 序列。