首页 > 其他分享 >树分治

树分治

时间:2024-11-02 16:58:18浏览次数:2  
标签:路径 frac 分治 depth 子树 统计

点分治

思想

回想序列分治的做法:递归统计两个区间,在统计跨两个区间的贡献

对应到树上也类似:找一个分割点,统计子树的贡献,再统计跨子树的贡献

由于路径都可以被某一级重心统计到,所以点分治长于做路径统计问题

找树的中心

树的中心:以它为根时的最大子树最小的点

处理方式:开全局变量\(maxsiz\),dfs找出每棵子树的大小(父亲的子树大小用\(sum-\sum siz[v]\)计算)

目的:使每次分割的子树尽量小

流程

1、找到树的中心;

2、统计子树中和该点有关的量;

3、删除该点,分裂出若干棵树,对每棵树做一遍点分治;

为什么时间复杂度是\(O(n\log n)\)?

对每棵树处理次数为\(n,siz_1,siz_2,...,siz_k\)

总和为\(n+\frac{n}{p_1}+\frac{n}{p_2}+...+\frac{n}{p_k}\)

大约和调和级数同阶,所以为\(O(n\log n)\)

P6626 [省选联考 2020 B 卷] 消息传递

点分治模板题

开桶,对子树内点,用桶统计子树外(过树的中心)贡献,对中心,直接统计子树贡献

进子树前记得去掉该子树的贡献

由于每个点都会成为中心,可以统计完全

P5984 [PA2019]Podatki drogowe

拼凑型题目,对于熟悉的人来说没有难处

1、路径第\(k\)大:二分答案+点分治计数

2、大数比较:主席树+哈希

3、发现值域过大,考虑在路径集内二分

4、发现路径集找权值中位数比较困难,考虑随机找一条权值在\(l,r\)之内的路径来做(随机二分)

5、

点分树

带修改的点分治,支持在线

点分治过程中,上一级重心向下一级连边,形成一棵有根树

性质:

1、树高\(O(\log n)\),一些看似暴力的东西也可以直接存(如每个点存储该子树全部信息,这是\(O(n\log n)\)的)

2、在点分上,\(LCA(x,y)\)一定在原树中\(x,y\)的路径上

P6329 【模板】点分树 | 震波

对每个点开深度线段树存子树权值,暴力跳\(fa[]\)统计即可

对于要刨掉的\(x\)所属子树\(p\),再开一棵线段树维护子树\(p\)到\(fa[p]\)的距离

边分治

把重心换成边即可,记得单点度数过大时要拆点

P4565 [CTSC2018]暴力写挂

一个常见思路:多树统计,用虚树DP

路径问题,考虑点分治或边分治,这里使用边分治

统计左子树和右子树之间的最大权,发现原树的\(depth(LCA(x,y))\)不好处理,考虑对贡献进行转化

\(\displaystyle depth(x)+depth(y)-(depth(LCA(x,y)+depth'(LCA'(x,y)))\)

\(\displaystyle =\frac 1 2 *dist(x,y)+\frac 1 2*(dep(x)+dep(y))-depth'(LCA'(x,y))\)

此时,原树的贡献可以完全放入\(x,y\)两个点内(\(\displaystyle \frac 1 2*(dis[x]+dep[x])\)),将它们挂到虚树上,DP可得答案

时间复杂度\(O(n\log ^2 n)\)

细节

1、为什么不用点分治?

点分治会产生若干棵子树,虚树DP很难\(O(n)\)解决

2、建虚树时存的\(lca\),不要算它的权值

3、猜猜我调了3h+,发现问题在哪,原来是\(fa[N][20]\)倍增数组开小了啊,我tm真是个sb

标签:路径,frac,分治,depth,子树,统计
From: https://www.cnblogs.com/zhone-lb/p/18522195

相关文章

  • 算法设计与分析中的几个核心算法策略:动态规划、贪心算法、回溯算法和分治算法
    这些题目主要考察的是算法设计与分析中的几个核心算法策略:动态规划、贪心算法、回溯算法和分治算法。下面我将分别介绍这些知识点,并解析题目的详细解答过程。1.动态规划(DynamicProgramming,DP)知识点介绍:动态规划是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问......
  • 【算法】分治算法-让问题消失
    博主推荐!!!:"近期我偶然邂逅了一个极为出色的人工智能学习平台,它不仅内容深入浅出,讲解方式还风趣幽默,让人学习起来既轻松又高效。如此宝藏资源,我迫不及待想要与各位共享,让我们一起进入这个精彩纷呈的学习网站吧!"即刻点击https://www.captainbed.cn/cyy算法系列:今天,我们要聊的......
  • CDQ 分治学习笔记
    鲜花开新坑。早该卷卷了。集训队论文自认为写的很清晰。感觉对于一道自己进集训队时的国赛题能发明一种新做法很牛啊!简述CDQ分治是一种离线分治做法。CDQ分治并没有很固定的模板,这是一种分治思想的延伸。对于一道带修的数据结构问题,我们可以将每个查询视作其之前修改对......
  • 两棵树问题的一种点分治做法
    简述题面:你有两棵树,\(T_1\),\(T_2\),然后你需要对于每个点求出\(\min_{j\not=i}(dist(T_1,i,j)+dist(T_2,i,j))\)要求时间复杂度\(O(n\log^2n)\)或更优做法:考虑点分治,假如在\(T_1\)固定\(i,j\)一定要经过某个\(x\),然后把\(x\)作为分治点,那么实际上\(val[i,j]=......
  • 线段树分治学习笔记
    前置知识:线段树(只需要了解其结构)支持撤销的数据结构,如可撤销并查集,可持久化数据结构等。线段树分治是什么一种离线算法,用于处理假如某些信息会在某个时间段出现,求某个时刻的信息并。常见的离线算法还有CDQ分治,考虑一下这两个算法的区别。CDQ分治:对于每个操作,考虑其对后面询......
  • 分治法求最大连续子序列的积
    1.源代码#include<iostream>#include<vector>#include<string>#include<sstream>usingnamespacestd;intmax3(intnum1,intnum2,intnum3){   if(num1>num2){      num2=num1;   }   returnnum2>num3?num2:n......
  • 分治---归并排序
    参考资料水平有限,欢迎交流!【如何优雅地排序——3分钟看懂【归并排序】的基本思想】练习题P1177【模板】排序-洛谷|计算机科学教育新生态(luogu.com.cn)LCR170.交易逆序对的总数-力扣(LeetCode)关键步骤与应用步骤在归并过程中,主要包含两个关键步骤:分割(Divide):将......
  • 【数据结构】分治算法经典: 快速排序详解
    快速排序(Quicksort)是一种高效的排序算法,最早由TonyHoare在1960年提出。它采用了分治(DivideandConquer)策略,平均时间复杂度为O(nlog......
  • 点分治相关
    点分治点分治适合处理大规模的树上路径信息问题。实现P3806【模板】点分治1给定一棵有\(n\)个点的树,询问树上距离为\(k\)的点对是否存在。\(n\leq10^4\)考虑简单深搜,对于任意子树,把路径分为经过根节点的路径和不经过根节点的路径。对于不经过根节点的路径,我们递归......