概述
题意
n <= 1e5
乍一看就是 log2 l o g 2
idea也比较多的题
好吧,一看操作,瞬间上cdq分治 + 虚树, 4k能写完+调完也是佩服自己。
先说一个比较经典的做法
然而并不需要这么麻烦,考虑u,v之间多算的距离,就是
2∗dis[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先说一个比较经典的做法有一个重构做法还有一个点分树做法 (其实这才是写博客的理由所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复