P9932 [NFLSPC #6] 树

题目背景

# 请不要使用 C++14 (GCC 9) 提交

题目描述

给定一棵 $n$ 个点的树,标号从 $0$ 到 $n-1$,每个点有一个 $0$ 到 $n-1$ 之间的颜色。 $q$ 次询问,每次查询 $x$ 的祖先中颜色为 $c$ 的点中离 $x$ 最近的一个(也就是深度最大的一个)的编号,**强制在线**。 **点的颜色在数据生成完之后进行了一次随机打乱(也就是作用了一个均匀随机的排列)**。

输入格式

**由于本题输入量较大,我们采用交互题的方式进行评测**。 你不需要也不应该实现主函数 `main`,你需要实现以下两个函数: ``` extern "C" void init(int n,vector fa,vector col) ``` * $n$:节点的个数。 * $fa$:长度为 $n$ 的数组,$fa_i$ 表示节点 $i$ 的父亲。特别地,$fa_0=-1$。 * $col$:长度为 $n$ 的数组,$col_i$ 表示节点 $i$ 的颜色。再次强调:**$col$ 在数据生成完之后进行了一次随机打乱**。 * 这个函数会被调用恰好一次,它给了你树的信息。你可以在这次函数调用的时候计算一些需要用到的信息。 ``` extern "C" int query(int x,int c) ``` * $x$:查询的节点编号。 * $c$:查询的颜色。 * 你应该返回 $x$ 的祖先中离 $x$ 最近的颜色为 $c$ 的节点的编号。若不存在这样的节点,返回 `-1`。 * 这个函数恰好被调用 $q$ 次。 * 每次调用函数时你并不知道以后的询问,也就是说,询问是 **强制在线** 的。 使用下发 grader 测试代码时,输入格式为: - 第一行输入两个数 $n,q$。 - 第二行输入 $n$ 个数 $fa_0,\cdots,fa_{n-1}$。 - 第三行输入 $n$ 个数 $col_0,\cdots,col_{n-1}$。 - 接下来 $q$ 行,每行两个数 $x,c$,表示一组询问。

输出格式

测试代码时,输出格式为: - $q$ 行,每行一个数,表示答案。 - 接下来,下发 grader 会输出你的耗时(注意这里并不会检查正确性)。 注意:这里给出的输入输出格式为下发 grader 的输入输出格式,仅为测试使用,**你实现的函数不应该对标准输入输出流进行任何操作**。

说明/提示

对于所有数据,$2\leq n\leq 2\times 10^6$,$q=5n\leq 10^7$,$-1\leq fa_i