jzoj4388 【GDOI2016模拟3.15】染色 (idea, 数据结构毒瘤)

86 篇文章 0 订阅
21 篇文章 0 订阅

题意

这里写图片描述
n <= 1e5

乍一看就是 log2 l o g 2

idea也比较多的题

好吧,一看操作,瞬间上cdq分治 + 虚树, 4k能写完+调完也是佩服自己。

先说一个比较经典的做法

然而并不需要这么麻烦,考虑u,v之间多算的距离,就是
2dis[lca] 2 ∗ d i s [ l c a ]

对于任意一个黑点x,将x到根的路径上标记 + 1
那么查询点y,即为查询y到根路径上各点标记 * 父亲边权之和。这个东西用树剖维护一下即可。
大概2k吧

有一个重构做法

用个数组存一下最近染黑的k个点,然后查询时暴力lca求这k个点,再加上树上换根预处理出来的答案。 当k到一定值时清进树里,重构预处理。复杂度大概是n^1.5 * lca ? 反正比较慢。

还有一个点分树做法 (其实这才是写博客的理由

点分树: 将点分治中每个连通块的分治中心作为这个连通块树的根。
即根为整棵树的重心,他的儿子分别为 将根取掉后所得各个连通块的重心…
树高是log的。

对于每个x,保存一下他到每一级祖先(分治中心)的距离。

其实就是模拟点分治过程, 查询y时从y开始跳, 到根为止。 每到一个点模拟一下以他为重心的点分治过程:
答案 加上 所有黑点(除了y所在连通块的,即点分树中x的y所在子树)到他的距离和 + 点数 * y到x距离。
(其中y到x距离可以预处理一下,这样就不需要在原树中求lca了。 空间n log n)

修改的话,对应修改一下距离和与点数就行。
这个做法是n log n的,非常秀 (lihui大哥)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值