点分治/点分树

news/2025/2/21 17:25:54/文章来源:https://www.cnblogs.com/harmisyz/p/18729635

点分治

额,就是你每次去找一棵树的重心,然后将这棵子树变成以这个重心为根的树,再在这个树上进行某些操作,就可以在 \(O(n\log n)\) 的时间复杂度遍历到任意两个点 \(u,v\)\(P(u,v)\) 上某个点 \(x\) 为根时候的贡献了。那么对于类似于求点对 \((u,v)\) 的某些价值和时,就可以上点分治。差不多吧,没啥用。然后可以去做河童重工。

点分树

点分树相当于动态点分治。对于每次找到的一个重心 \(x\),我们去 \(x\) 为根的子树中又找到了若干个 \(x\) 的儿子为根的子树中的重心 \(v_1\sim v_k\),那么在点分树上就有:\(fa_{v_i(1 \le i \le k)}=x\)。那么现在这棵点分树上任意一个点 \(u\),都有 \(dep_u \le \log n\),那么还有这棵树上所有节点的 \(siz\) 之和是 \(n\log n\) 级别的。性质优美,所以暴力。

那么对于点对 \((u,v)\) 贡献和的问题,我们就可以考虑枚举 \(u\),然后枚举 \(\operatorname{LCA}(u,v)=x\),维护 \(y \in son_x \land \operatorname{LCA}(y,u)\ne y\) 的子树中所有节点的价值,和 \(u\) 一起计算一下贡献。

来点例题/练习题。

P6329

题意是说支持动态修改点权,求 \(\sum \limits_{y=1}^{n} val_y [dis_{x,y}\le k]\)

我们把点分树建出来。先不考虑点权的修改,考虑如何维护 \(x\) 已知时的答案。我们去枚举 \(\operatorname{LCA}(x,y)=u\),记 \(f_{u,k}=\sum\limits_{v=1}^{n}val_v [\operatorname{LCA}(u,v)=u\land dis_{u,v}+1 \le k],g_{u,k}=\sum\limits_{v=1}^{n}val_v [\operatorname{LCA}(u,v)=u\land dis_{u,v}\le k]\)。那么对于当前枚举到的一个 \(u\),假设我们是从 \(v\)\(father\) 上来的,那么有贡献为:\(g_{u,k-len}-f_{v,k-len}\),其中 \(len\)\(x\)\(u\) 的距离。

那么我们只要维护出来 \(f_{u,k}\)\(g_{u,k}\) 就行了。你会发现,\(f_{u,k}=g_{u,k-1}\),然后贡献就行 \(g_{u,k-len}-g_{v,k-len-1}\)。对于一个点 \(u\) 的点权变成 \(val\),它会给到贡献的点 \(v\) 一定是 \(u\) 的祖先。我们去枚举 \(v\),已知了一个路径长度 \(len\),那么 \(k \ge len\) 的都有:\(f_{v,k} \to f_{v,k}+val\)

然后就做完了,可以任意维护 \(f_{i,j}\)。比如对每个 \(i\) 开一棵动态开点线段树。由于每次修改只会更新 \(O(\log n)\) 个节点,每个节点是一个区间加,那么单次修改会最多新增 \(O(\log^2 n)\) 个点。总的点数是 \(O(n\log^2 n)\) 的,时间复杂度 \(O(n\log^2 n)\)

P10603

就是把 P6329 操作反过来。对于枚举的 \(\operatorname{LCA}(x,y)=u\),每次相当于是 \(O(1)\) 次 dfn序区间上 \(dep_v\) 不超过某个值的修改。注意到我们的询问是单点查询,所以可以考虑直接在点 \(u\) 上面加个 tag,表示 \(dep_v\) 不超过某个值的所有点会增加某个值。然后单点查询的时候暴力枚举 \(\operatorname{LCA}\) 算下贡献和就行了。时间复杂度 \(O(n\log^2 n)\)

P10604

\(dis_{x,y}\) 的第 \(k\) 小值。那么当 \(\sum\limits_{i=1}^{n}[dis_{x,y} \le K] <k\) 时,说明第 \(k\) 小值比 \(K\) 大。然后二分即可,时间复杂度 \(O(n\log^3 n)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887677.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当任务失败时,顶级调度系统如何实现分钟级数据补偿?

一、补数机制的定义与挑战 补数(Backfill) 指在数据管道因系统故障、数据延迟或逻辑错误导致历史任务缺失时,重新调度并执行指定时间范围内的工作流以修复数据缺口。在大数据场景中,补数机制需解决三大核心挑战:复杂依赖链重建:需精准识别历史时间段内任务上下游关系,避…

绿色建筑设计原则与案例分析 - 如何将环保理念融入建筑设计中

在这个追求可持续发展的时代,绿色建筑不仅是一种趋势,更是对地球未来的责任和承诺。它旨在通过最少的环境影响,提供健康、高效、舒适的生活与工作空间。本文将深入探讨绿色建筑设计的核心原则,并通过具体案例分析,揭示如何将环保理念巧妙融入建筑设计之中,为读者呈现一场…

Windows 程序隐藏启动黑窗口总结

免责声明: 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。以下文章来源于锦鲤安全 ,作者四五qq 前言 Windows 控制台程序在启动时会出现一个黑(dos)窗口,一般我们想要隐…

docker部署.net core3.1

1.安装dockerapt install docker.io2.拉取.net core依赖镜像docker pull mcr.microsoft.com/dotnet/core/aspnet:latest3.创建.net core3.1项目 选择docker支持,会生成dockerFile配置文件如图:4.编写dockerfile文件,经删减后为:FROM mcr.microsoft.com/dotnet/core/aspnet:3…

DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了

DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了作者:沉默王二近期有几个热点事件,不知道大家关注到没有?第一个标志事件,一向挑剔的苹果宣布和阿里合作,一起为国行版 iPhone 提供 AI 技术服务。 第二个标志事件,DeepSeek R1 蒸馏了 6 个模型开源给社区,其中有 4 个来…

redission-delay-queue使用及原理

1.引入jar包<dependency><groupId>xxxx.delay</groupId><artifactId>redisson-delayed-queue</artifactId><version>1.0.0-SNAPSHOT</version> </dependency>2.客户端代码开发2.1:新增实现BaseTask的bean 参数由业务自行决定…

利用网页爬虫从专业产品论坛提取评论的完整指南

了解如何通过网页爬虫从专业产品论坛提取评论,以获取可操作的洞见、改进策略,并节省时间。利用网页爬虫从专业产品论坛提取评论已经成为企业的游戏规则改变者。它使您能够从多个平台收集客户反馈(https://dataforest.ai/blog/top-web-scraping-use-cases),实时监控情绪,并自…

树的重心(树形dp)

我最开始将n减了1,应为边长有n-1条,但是这会导致计算时出现错误,因为其他地方会用到n#include<iostream> #include<vector> using namespace std; const int N=1e5+5; vector<int>v[N]; int f[N]; int vis[N]; int ans=1e5; int n; int dfs(int x){vis[x]…

仓库管理到底该怎么管?记住这五常六准原则!

仓库管理到底该怎么管? 要是你觉得仓库只是个“堆货的地方”,那可就大错特错了! 想象一下,货物乱成一团,找东西时费劲,出库慢,结果错发了货,那可真的是“大麻烦”啊。 客户打电话来投诉,老板又来催货,这种情况谁遇到谁头疼。 但其实,仓库管理不复杂,只要掌握了一些…

让窗口显示在所有虚拟桌面上

功能如图 C#代码实现如下public partial class MainWindow : Window {public MainWindow(){InitializeComponent();ShowInTaskbar = false;this.Loaded += MainWindow_Loaded;}private void MainWindow_Loaded(object sender, RoutedEventArgs e){IntPtr a = new System.Window…

[Vite] 性能优化

关于HTTP: https://www.cnblogs.com/Answer1215/p/18729206 DNS 打包方式:所有代码(包括 lodash-es、element-ui 等)被打包到一起,部署时只需请求一个或几个大文件。 优点是简单,不需要额外的网络请求;缺点是文件体积大,首次加载延迟较高,而且用户如果之前访问过其他…

python 并发场景梳理

一、多进程(Multiprocessing) 1、使用场景 适合CPU密集型任务,因为每个进程运行在独立的Python解释器中,不受全局解释器锁(GIL)的影响。 2、代码from multiprocessing import Process import timedef task():print("Task is running")time.sleep(10)processes …