FA 科技:一种基于换根 + DFS 序的点分治下下位替代
起因:cjx 暑假集训的时候出了道题,老师说可以点分治。但是我最初的想法其实是换根处理,但怎么想发现都行不通,因为要同时维护 DFS 序和权值。于是就没想了。后来 10.5 和 xyh 进行长达 30s 的讨论 导游的工作 那题,说了我这个想法,xyh 觉得有道理,对要求解的问题具体化,于是我才想出了分块这一数据结构。并在 xyh 的指导下进行卡常。但其实这个方法已经被发明过了。Tree 那道题的题解里有提到过。
这个方法的复杂度是
例题 1:BNDSOJ 1502 导游的工作
Method 1:暴力换根
我们钦定
Method 2:分块优化换根
基本的思想还是 暴力统计。我们只是在用数据结构强行优化这个暴力。
考虑 树上换根动态规划 的思想。统计每个点的答案贡献。前提是你对换根法有了较为深刻的理解。但我们知道,如果把根从
那我们怎样快速修改这个“不连续”的区间呢?如果你知道 树链剖分。那你一定知道它的下位替代—— DFS 序线段树 吧。其实就是根据 子树的 DFS 序连续 这一特性,把不连续的编号转化为连续的 DFS 序进行修改。在这一题里也同样是这么使用的。
但是这题我们并不能使用线段树。因为我们要的操作是这两种:
- 区间加减
- 全局询问小于等于
的 depth 的个数
其实第二个的全局我们可以加强成区间。你会发现这个东西基本等价于 P2801 教主的魔法。于是我们可以使用 分块 维护。
于是时间复杂度为
例题 2:P3806 【模板】点分治 1
这个因为时限卡的过死于是不能满分,虽然说暴力也可以拿到 60 pts,但是我想说这个换根的方法是远优于暴力的。
这个题其实和上面那个题没有本质区别。还是换根,然后询问全局有没有等于
最主要的不同就是把询问离线下来,每次换根的时候都处理一次
例题 3:P4178 Tree
这个就纯纯与导游的工作那题没有任何区别,所以我认为导游的工作那题也是紫。
就是把求最大变成全局统计小于等于
注意如果换根统计出来的答案是
例题 4:P2634 [国家集训队] 聪聪可可
稍微变一下形,这题的复杂度是
就是询问树上边权和为
注意散块的处理要尤为注意,就是因为散块,我们还要维护一个区间加再模
主要难点都是在分块。换根本身没啥难的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】