洛谷 SP10707 COT2:Count on a tree II ← 树上莫队算法(基础莫队算法 + LCA + 欧拉序)
【题目来源】
【题目描述】
给定一棵包含 N 个节点的树,节点编号从 1 到 N。每个节点都有一个整数点权。
你需要回答若干组询问,询问的形式如下:
u v:求从节点 u 到节点 v 的简单路径上,有多少种不同的点权。
【输入格式】
第一行包含两个整数 N 和 M。(N≤4×10^4, M≤10^5)
第二行包含 N 个整数,第 i 个整数表示第 i 个节点的点权。
接下来的 N−1 行,每行包含两个整数 u 和 v,表示节点 u 和节点 v 之间存在一条树边。
接下来的 M 行,每行包含两个整数 u 和 v,表示一组询问。
【输出格式】
对于每组询问,输出一行一个整数,表示对应询问的答案。
【输入样例】
8 2
105 2 9 3 8 5 7 7
1 2
1 3
1 4
3 5
3 6
3 7
4 8
2 5
7 8
【输出样例】
4
4
【数据范围】
N≤4×10^4, M≤10^5。
【算法分析】
● 基础莫队算法:
● 本题如果测试数据点权极大,必须增加离散化代码,否则数组越界。
“离散化”代码,参见:
● 树上莫队(Tree Mo's Algorithm)是基础序列莫队在树形结构上的拓展算法。其核心思想是借助入栈出栈式欧拉括号序,将整棵树序列化成长度为 2n 的一维数组,从而将树上的路径查询与子树查询,等价转化为该一维数组上的区间查询问题。
树上莫队算法的实现,需要欧拉序、LCA 等前置知识。
(1)欧拉序:
(2)LCA:
【算法代码】
【参考文献】

浙公网安备 33010602011771号