久未放晴的|

TulipeNoire

园龄:1年10个月粉丝:18关注:17

「NOI2018」情报中心

考虑令 f(i)=dist(ui,vi)2wi,那么一种方案 (ui,vi,wi)(uj,vj,wj) 的贡献(钦定相交部分一边都是 u,一边都是 v)的两倍就是 f(i)+f(j)+dist(ui,uj)+dist(vi,vj)。枚举 t=LCA(ui,uj),那么即是:

f(i)+f(j)+dui+duj2dt+dist(vi,vj)

考虑在 vi 处插入一个权值为 f(i)+dui 的物品,那么枚举 t,就是求在 t 处合法的物品对的带权距离最大值。这个信息是可以线段树合并的(具体方法就是记录当前集合的最大答案点对,合并时从两个集合中选出总共两个数算贡献,要用到 O(1) 求 LCA)。我们考虑什么样的物品对是在 t 处合法的。显然 ui 要在 t 的子树内,并且 LCA(ui,vi)t 的祖先。并且 uiuj 处于 t 的不同子树(t 自己单独算一棵子树)内。容易发现在 ui 处插入物品,在 LCA(ui,vi) 之前删除物品,这样做线段树合并即可。具体实现时有可能把 v 当作 u 来看,我们只需要对于 v 做对称的插入和删除就可以了。单组时间复杂度是 O((n+m)(logn+logm)) 的。但是特别卡常。一个卡常技巧是当子树都删光了过后就不用往下遍历了,视作空节点。

细节有点多,比如说你要满足点对的贡献必须来自两个不同的物品,否则合并会有问题。空节点的信息要是 inf,并且即便在这种情况下权值和答案一定要对应(比如是两个 inf 的相同位置的物品,那么答案就一定要是 2inf),或者只是我写得太丑了。

本文作者:TulipeNoire

本文链接:https://www.cnblogs.com/TulipeNoire/p/18688584/NOI2018_D2T2

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TulipeNoire  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起