CF1303G(点分治+李超线段树)

CF1303G(点分治+李超线段树)

题目大意

给你一棵 n 个点的带点权的树,你需要求出树上的一个路径 \(x_1,x_2,\ldots,x_k,最大化 \sum_{i=1}^kia_{x_i}\),求最大权值。

数据范围

\(2\le n\le 150000\)

一条最大的路径并不好考虑如何直接求得, 我们试图把它用两条路径来合并

把一条过点\(x_k\)的路径\(x_1, x_2, x_3\cdots x_{k-1},x_k ,x_{k+1}\cdots x_n\) 看成两条

\(x_1, x_2, x_3\cdots x_{k-1}\) 权值为\(V_1\) 长度为\(l_1\), 和为\(S_1\)

\(x_k ,x_{k+1}\cdots x_n\) \(V_2, l_2, S_2\)

那么\(V=V_1+V_2 + S_2*l_1\)

既然是可\(O(1)\)合并的, 又不难枚举, 可以想到用点分治来枚举中间点

但我们可能要和一堆路径合并, 怎么找到对于我手中已经有的一段路径找到另一条和它权值和拼起来最大的路径呢?

观察发现, 想一次函数, 把\(l_1\)看做\(x\), S看做k, 那就是找到一个一次函数 \(y = S_2 * x + V_2\), 使\(x = l_1\)最大吗, 这个可以用李超线段树做

猜你喜欢

转载自www.cnblogs.com/Hs-black/p/12378841.html