#P16912. [Ontak2026]又是树

    ID: 16126 传统题 5000ms 1024MiB 尝试: 5 已通过: 2 难度: 10 上传者: 标签>数据结构树论树链剖分算法基础倍增线段树CF2900

[Ontak2026]又是树

题目描述

给定一棵 nn 个顶点的带权树。记 w(u,v)w(u,v) 为顶点 u,vu,v 之间边的权值。

考虑从顶点 uu 到顶点 vv 的唯一简单路径:

P=(u,s1,s2,,sk1,v)P=(u,s_1,s_2,\ldots,s_{k-1},v)

按从 uu 走向 vv 的顺序,把路径上的边权记为:

a=(a1,a2,,ak)a=(a_1,a_2,\ldots,a_k)

其中 a1=w(u,s1)a_1=w(u,s_1)a2=w(s1,s2)a_2=w(s_1,s_2),……,ak=w(sk1,v)a_k=w(s_{k-1},v)

定义:

$\displaystyle f(u,v)=\sum_{i=1}^{k}\max_{1\le j\le i}a_j$。

也就是说,从 uuvv 行走时,每经过一条边,都记录“到目前为止遇到的最大边权”,并把这些前缀最大值全部相加。

现在有 qq 个询问。每个询问给出两个顶点 (ui,vi)(u_i,v_i),你需要计算 f(ui,vi)f(u_i,v_i)

注意 f(u,v)f(u,v) 一般不等于 f(v,u)f(v,u)

u=vu=v 时,路径不含边,答案为 00

输入格式

第一行包含两个整数 n,qn,q

  • 1n21051\le n\le2\cdot10^5
  • 1q1051\le q\le10^5

接下来 n1n-1 行,每行包含三个整数 ai,bi,cia_i,b_i,c_i

  • 1ai,bin1\le a_i,b_i\le n
  • aibia_i\ne b_i
  • 1ci1091\le c_i\le10^9

表示顶点 aia_ibib_i 之间有一条权值为 cic_i 的边。保证这些边构成一棵树。

接下来 qq 行,每行包含两个整数 ui,viu_i,v_i,表示一个询问。

输出格式

输出 qq 行。

ii 行输出一个整数 f(ui,vi)f(u_i,v_i)

样例

5 4
3 1 2
3 5 8
3 4 7
5 2 1
2 1
1 2
4 5
5 5
17
18
15
0

样例说明

对于询问 212\to1,路径边权依次为 (1,8,2)(1,8,2),前缀最大值依次为 (1,8,8)(1,8,8),因此答案为 1+8+8=171+8+8=17

对于询问 121\to2,边权依次为 (2,8,1)(2,8,1),前缀最大值为 (2,8,8)(2,8,8),答案为 1818

对于询问 454\to5,边权依次为 (7,8)(7,8),答案为 7+8=157+8=15

子任务

子任务 限制 分值
1 n,q100n,q\le100 12
2 n,q2000n,q\le2000 13
3 树是一条链,且边按 (ai=i,bi=i+1)(a_i=i,b_i=i+1) 给出 15
4 每个询问 (ui,vi)(u_i,v_i) 中,从 uiu_iviv_i 的路径都会经过顶点 rr(某个固定顶点)
5 q15000q\le15000
6 无额外限制 30