首页 > 试题广场 >

漂亮的公园

[编程题]漂亮的公园
小N所在城市有n个漂亮的公园。有恰好n-1条双向道路连接这n个公园,保证公园间相互可以通过道路到达。每个公园i都有一个专属的属性c[i],表示这个公园的特色。
现在小N有q个疑问。每次他会有两个特定的特色x和y(这两个数可能相同)。他想知道,假如他随便选取一个特色为x的公园出发,必须走到一个特色为y的公园结束,在最优情况下,他最远能走过多少条道路。换句话说,枚举所有的满足c[p] = x的公园p,所有满足c[q] = y的公园q,求出p,q距离的最大值。

输入描述:
第一行两个整数n和q。
第二行n个整数,第i个整数表示第i个公园对应的特色c[i]。
接下来n-1行,每行两个整数u和v,表示有一条连接公园u和公园v的道路。
接下来q行,每行两个整数x和y,代表小N的一个疑问。
数据保证:n ≤ 105, q ≤ 105, 1 ≤ u, v ≤ n, 0 ≤ c[i], x, y ≤ 109


输出描述:
输出共q行,每行对于小N的一个疑问的答案。注意,假如一个疑问中,不存在一个公园特色为x,或不存在一个公园特色为y,那么输出答案0。代表小N一条边都走不了。
示例1

输入

10 4
9 8 9 8 9 8 7 7 8 7
4 5
5 10
10 3
3 9
9 1
1 8
5 7
10 6
8 2
5 8
8 8
7 9
8 9

输出

0
7
5
6
头像 小嗷犬
发表于 2023-08-19 22:25:03
考察知识点:树上 DFS、倍增、LCA 设 为颜色 的两个直径端点(即距离最远的两个点), 为颜色 中的一个点,则点 到颜色 中点的最大距离为 。 可以想象一个点到一条线段的最远距离必然出现在这个点到两个端点的距离中,在此不做严格证明。 进而我们有如下结论: 设 为颜色 的两个直径端点 展开全文
头像 fuzhiji
发表于 2020-06-03 00:42:24
假设节点颜色为 ,对于求颜色 在树上距离最大的两点,我们需要先找出树上颜色为 的距离最大的两点,找出树上颜色为 的距离最大的两点,然后枚举求不同颜色的两点距离,得到的最大值就是 的最远距离。 所以,我们只需要预处理出所有颜色的最远两点,然后计算的时候用LCA求距离即可。 当然,颜色可能很多,多达 种 展开全文
头像 阿里嘎多懒羊羊桑_
发表于 2020-06-04 15:38:56
牛客—— 漂亮的公园 (离散化+LCA+结论) 原题链接 题意: 给定一棵树,每个节点都对应有一个颜色,问询问的两个颜色之间的最大距离(可两个颜色可以相同也可以不同)。 思路: 首先要知道一个结论是对于同一种颜色的直径端点a,b,另一个点c到达这种颜色的最大值,一定是dis(a,c)和dis(b,c 展开全文