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

随声附和 提交于 2020-02-28 20:31:23

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\)最大吗, 这个可以用李超线段树做

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!