点分治 + 线段树合并.
- 英语月考的时候一直在想这个题…
- 有路径长度的限制,可以考虑点分治.然后发现在合并两条路径时有两种情况.
- 靠近当前分治中心的那两条边如果颜色不同,就直接将两条路径权值加起来.否则还要减去那条边的颜色权值.
- 分治时把子树按照与当前分支中心连接的边的颜色排序,扫一遍,维护两颗线段树,分别表示连到分治中心的边与当前颜色不同的最大权值与相同的最大权值.
- 处理完一种颜色的时候把两颗线段树合并起来就好了.时间复杂度 $O(nlog^2n)$ .
bzoj 不支持 C++11 是真的毒瘤…
1 |
|