我是靠谱客的博主 酷炫香烟,最近开发中收集的这篇文章主要介绍jzoj4388 【GDOI2016模拟3.15】染色 (idea, 数据结构毒瘤)题意乍一看就是 log2 l o g 2 log^2先说一个比较经典的做法有一个重构做法还有一个点分树做法 (其实这才是写博客的理由,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意

这里写图片描述
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大哥)

最后

以上就是酷炫香烟为你收集整理的jzoj4388 【GDOI2016模拟3.15】染色 (idea, 数据结构毒瘤)题意乍一看就是 log2 l o g 2 log^2先说一个比较经典的做法有一个重构做法还有一个点分树做法 (其实这才是写博客的理由的全部内容,希望文章能够帮你解决jzoj4388 【GDOI2016模拟3.15】染色 (idea, 数据结构毒瘤)题意乍一看就是 log2 l o g 2 log^2先说一个比较经典的做法有一个重构做法还有一个点分树做法 (其实这才是写博客的理由所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部