#sLPFybttg040501. 1560:【例 1】树的统计

1560:【例 1】树的统计

题目描述

一树上有 nn 个节点,编号分别为 11nn,每个节点都有一个权值 ww。我们将以下面的形式来要求你对这棵树完成一些操作:

  1. CHANGE u t :把节点 uu 权值改为 tt
  2. QMAX u v :询问点 uu 到点 vv 路径上的节点的最大权值;
  3. QSUM u v :询问点 uu 到点 vv 路径上的节点的权值和。

注意:从点 uu 到点 vv 路径上的节点包括 uuvv 本身。


输入格式

第一行为一个数 nn,表示节点个数;

接下来 n1n-1 行,每行两个整数 a,ba,b,表示节点 aa 与节点 bb 之间有一条边相连;

接下来 nn 行,每行一个整数,第 ii 行的整数 wiw_i 表示节点 ii 的权值;

接下来一行,为一个整数 qq ,表示操作总数;

接下来 qq 行,每行一个操作,以 CHANGE u tQMAX u vQSUM u v 的形式给出。


输出格式

对于每个 QMAXQSUM 的操作,每行输出一个整数表示要求的结果。


样例

输入样例 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

初始权值:节点 11 权值 44,节点 22 权值 22,节点 33 权值 11,节点 44 权值 33

操作解释:

  1. QMAX 3 4:路径 32143 \to 2 \to 1 \to 4,权值 [1,2,4,3][1,2,4,3],最大值 44
  2. QMAX 3 3:路径只有 33,最大值 11
  3. QMAX 3 2:路径 323 \to 2,权值 [1,2][1,2],最大值 22
  4. QMAX 2 3:同上,最大值 22
  5. QSUM 3 4:路径 32143 \to 2 \to 1 \to 4,权值和 1+2+4+3=101+2+4+3=10
  6. QSUM 2 1:路径 212 \to 1,权值和 2+4=62+4=6
  7. CHANGE 1 5:节点 11 权值改为 55
  8. QMAX 3 4:路径 32143 \to 2 \to 1 \to 4,权值 [1,2,5,3][1,2,5,3],最大值 55
  9. CHANGE 3 6:节点 33 权值改为 66
  10. QMAX 3 4:路径 [6,2,5,3][6,2,5,3],最大值 66
  11. QMAX 2 4:路径 2142 \to 1 \to 4,权值 [2,5,3][2,5,3],最大值 55
  12. QSUM 3 4:路径 6+2+5+3=166+2+5+3=16

数据范围

  • 1n3×1041 \le n \le 3 \times 10^4
  • 0q2×1050 \le q \le 2 \times 10^5
  • 中途操作中保证每个节点的权值 ww30000-300003000030000 之间。

时间限制:1000 ms
内存限制:524288 KB


提示

这是经典的树链剖分(重链剖分) 问题,用于解决树上路径查询与单点修改。

主要思想:

  1. 通过两次 DFS 将树剖分成若干条重链,并给每个节点分配一个 DFS 序编号,使得每条重链上的节点编号连续。
  2. 用线段树或树状数组维护 DFS 序序列上的区间最大值和区间和。
  3. 对于路径查询 (u,v)(u,v),可以将路径拆分成若干条重链对应的区间,在线段树上分别查询后合并结果。
    • 求路径最大值:取各区间最大值中的最大值。
    • 求路径和:累加各区间和。

步骤:

  • 第一次 DFS:求每个节点的深度 depdep、父节点 fafa、子树大小 sizesize、重儿子 sonson
  • 第二次 DFS:分配 DFS 序 idid,并记录每个节点所在链的顶端 toptop
  • 建立线段树,初始值为每个节点权值按 idid 顺序存放。
  • 对于 CHANGE u t:将 id[u]id[u] 位置的权值改为 tt
  • 对于 QMAX u vQSUM u v:当 uuvv 不在同一条链上时,将较深节点往上跳,每次查询该节点到链顶的区间,并跳到链顶的父节点,直到 uuvv 在同一条链上,最后查询 uuvv 之间的区间。

时间复杂度:树链剖分预处理 O(n)O(n),每次路径查询 O(log2n)O(\log^2 n)(线段树查询 O(logn)O(\log n),跳链 O(logn)O(\log n)),对于 n3×104,q2×105n \le 3\times 10^4, q \le 2\times 10^5 可以接受。

注意:权值可能为负数,求最大值时初始值应设为 - \infty