【题解】P6199 [EER1]河童重工

东方吧有个老哥上网搜河童重工结果出来这个题,炸出来一车 OIer,笑死我了 /kx

点分治太玄学了吧,正确写法到底是什么???

题意

给定两棵树 T1,T2,结点一一对应,在结点 u,v 之间连边的代价是它们在 T1,T2 上的树上路径长度之和。求结点两两连边形成的完全图的最小生成树权值。

2n105

思路

点分治 + 虚树。

首先套路地考虑在 T2 上点分治,钦定有效路径过重心。

然后令 depu 表示结点 u 到分治重心的距离,那么在 u,v 之间连边的距离就是 depu+depv+T1.dis(u,v),就变成了 AT3611.

这里暴力算 dis 的复杂度是错的,考虑先对当前分治重心的子树在 T1 上建一棵虚树。

具体考虑的是把每个结点 u 拆成两份 u,u=u+n,连长度为 depu 的边。令 u 为虚点。

考虑在虚树上跑一遍 dijkstra 求出距离每个结点 u 最近的虚点,记为 preu。考虑对于虚树上的每一条边 (u,v),在 preu,prev 之间连一条长度为 disu+disv+w(u,v) 的边,其中 disu,disv 表示 u,v 到最近虚点的距离,w(u,v) 表示 (u,v) 的边权。

实际上等价于钦定每一条边算它的贡献,这里感觉有点像边分治做这类套路的时候在虚树上枚举 LCA,但是具体不太会证。

然后跑一遍 kruskal 就行。

时间复杂度 O(nlog2n)

代码

posted @   kymru  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2022-01-12 扩展欧几里得
点击右上角即可分享
微信分享提示
主题色彩