Loading

[Ynoi2008] rdCcot

先考虑 C=1 的情况,我们发现答案等价于求父亲不在询问区间内的点数,这个东西可以轻易用扫描线加树状数组维护。

再考虑链的情况,我们将统计方式定为统计连通块深度最小的,那么点 u 能产生贡献的区间则为所有满足 depudepvCvu 的前驱和后继,算这个东西可以用平衡树或者线段树维护,然后再扫描线。

而一般情况中条件并没有刚刚的那么清晰了,因为连通块变成了没啥性质的图,那么看起来就不可做了啊,开摆。大胆猜想,我们可不可以对于一般情况也能像链那样把树拍在一个序列中对于每个点算贡献呢?算贡献方式即算每个连通块在序列中最前面的点。一般图中找一个特殊点出来统计是很难的,我们需要序列存在一个等价关系,即对于任意的 i,若 j 满足 j<idist(pi,pj)>C,则 pi,pj 也不会经过其它点互达。这个时候就需要伟大的 bfs 序了!我们发现,如果我们把每个点按 bfs 序排序,那么这个序列有个极好的性质,对于 i<j<k,若 dist(pi,pk),dist(pj,pk)Cdist(pi,pj)C,证明是好证的。

那么有了这个性质就可以证明按 bfs 序排列的序列可以满足等价条件了,这也是好证的。

那么我们就可以像链一样求出区间然后扫描线了。但是怎么求这个区间呢?可以考虑点分治并且用以标号排序的平衡树求前驱后继,并维护子树的最小深度就可以在平衡树上二分了。时间复杂度 O(nlog2n+mlogn)

这题有些轻微卡常,我们可以在二分时用循环实现递归,并且点分治分治到只有一个点的时候直接 return,而且若一个点本身的深度就已经大于 C 了那就可以不用管了,加上这些应该就能过了。

作者:lalaouye

出处:https://www.cnblogs.com/lalaouyehome/p/18739531

版权:本作品采用「114514」许可协议进行许可。

posted @   lalaouye  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示