#sLPFybttg040501. 1560:【例 1】树的统计
1560:【例 1】树的统计
题目描述
一树上有 个节点,编号分别为 到 ,每个节点都有一个权值 。我们将以下面的形式来要求你对这棵树完成一些操作:
CHANGE u t:把节点 权值改为 ;QMAX u v:询问点 到点 路径上的节点的最大权值;QSUM u v:询问点 到点 路径上的节点的权值和。
注意:从点 到点 路径上的节点包括 和 本身。
输入格式
第一行为一个数 ,表示节点个数;
接下来 行,每行两个整数 ,表示节点 与节点 之间有一条边相连;
接下来 行,每行一个整数,第 行的整数 表示节点 的权值;
接下来一行,为一个整数 ,表示操作总数;
接下来 行,每行一个操作,以 CHANGE u t 或 QMAX u v 或 QSUM u v 的形式给出。
输出格式
对于每个 QMAX 或 QSUM 的操作,每行输出一个整数表示要求的结果。
样例
输入样例 1
4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
输出样例 1
4
1
2
2
10
6
5
6
5
16
样例解释
初始树结构:
1
/ \
2 4
/
3
初始权值:节点 权值 ,节点 权值 ,节点 权值 ,节点 权值 。
操作解释:
QMAX 3 4:路径 ,权值 ,最大值 。QMAX 3 3:路径只有 ,最大值 。QMAX 3 2:路径 ,权值 ,最大值 。QMAX 2 3:同上,最大值 。QSUM 3 4:路径 ,权值和 。QSUM 2 1:路径 ,权值和 。CHANGE 1 5:节点 权值改为 。QMAX 3 4:路径 ,权值 ,最大值 。CHANGE 3 6:节点 权值改为 。QMAX 3 4:路径 ,最大值 。QMAX 2 4:路径 ,权值 ,最大值 。QSUM 3 4:路径 。
数据范围
- 中途操作中保证每个节点的权值 在 至 之间。
时间限制:1000 ms
内存限制:524288 KB
提示
这是经典的树链剖分(重链剖分) 问题,用于解决树上路径查询与单点修改。
主要思想:
- 通过两次 DFS 将树剖分成若干条重链,并给每个节点分配一个 DFS 序编号,使得每条重链上的节点编号连续。
- 用线段树或树状数组维护 DFS 序序列上的区间最大值和区间和。
- 对于路径查询 ,可以将路径拆分成若干条重链对应的区间,在线段树上分别查询后合并结果。
- 求路径最大值:取各区间最大值中的最大值。
- 求路径和:累加各区间和。
步骤:
- 第一次 DFS:求每个节点的深度 、父节点 、子树大小 、重儿子 。
- 第二次 DFS:分配 DFS 序 ,并记录每个节点所在链的顶端 。
- 建立线段树,初始值为每个节点权值按 顺序存放。
- 对于
CHANGE u t:将 位置的权值改为 。 - 对于
QMAX u v和QSUM u v:当 和 不在同一条链上时,将较深节点往上跳,每次查询该节点到链顶的区间,并跳到链顶的父节点,直到 和 在同一条链上,最后查询 到 之间的区间。
时间复杂度:树链剖分预处理 ,每次路径查询 (线段树查询 ,跳链 ),对于 可以接受。
注意:权值可能为负数,求最大值时初始值应设为 。