点分治 学习笔记

0. 点分治的用途

点分治可以解决树上的关于路径的问题,例如 洛谷P4178 Tree。(题目大意:给定一棵 (n) 个节点的树,每条边有边权,求出树上两点距离小于等于 (k) 的点对数量)这道题如果使用 (O(n^2)) 的暴力算法 显然 会T飞 ,然而之后您就会看到,点分治算法可以在 (O(n\log^2 n)) 的时间复杂度内解决它。

1.思想

顾名思义,点分治使用了分治的思想,把原问题拆分成若干个子问题,分别求解后再合并。把大象装进冰箱里需要几步?

1.1. 分

注意到如果指定一个节点为根节点,那么一个路径有可能有以下两个来源:

1.

点分治 学习笔记路径经过根节点;
2.点分治 学习笔记路径完全被子树包含。

到这里一个分治算法已经呼之欲出了——可以递归地处理第二种情况,只需要在算法中考虑第一种情况就可以了。

1.2. 治

第二种情况可以递归地处理,并且递归到叶子节点时就不需要考虑第二种情况了(根本没有子树),所以这里主要考虑第一种情况。

按顺序考虑每一个子树,用一个树状数组(或者是一个别的什么数据结构)来维护根节点到已经考虑过的每一个节点,在新加入一个子树时对于新子树的每一个节点求出有多少个根节点到”老节点”的距离小于 ((k-) (根节点到新节点的距离))并统计进答案,再把每一个新节点塞进树状数组里。这样就解决了第一种情况了。

最好结合代码理解:

//mark:树状数组 g:图
int dis[MAXN+5],tail;
void get_dis(int u,int fa,int now){
    dis[++tail]=now;
    for(int i=0;i

1.3. 合

只需要无脑地把每种情况加起来就可以了(

1.4. “细节”

在递归时一定要用子树的重心作为根节点,这样才能保证时间复杂度最优。

至于证明,关于此,我确信已发现了一种美妙的证法 ,可惜这里空白的地方太小,写不下。 其实是我太菜了不会证TwT 可以感性理解一下,根节点取重心可以使问题分割地尽可能均匀,分治就跑得飞快了。

2. 时间复杂度

据说是 (O(n\log^2 n)) 的,然而我不会证啊qaq

如果递归时根节点不取重心,时间复杂度会退化为 (O(n^2\log n)),还不如暴力。

3. Code

#include
using namespace std;
#define MAXN 40000
#define MAXW 1000
#define INF 0x3fffffff
struct BIT{//一般通过树状数组
    int tree[MAXN*MAXW+5];
    int query(int x){
        int res=0;
        while(x){
            res+=tree[x];
            x-=x&-x;
        }
        return res;
    }
    void add(int x,int k){
        while(x g[MAXN+5];
bool removed[MAXN+5];//由于每个点在递归之后就没用了,所以要打个标记把它移除掉
int zx,zx_maxx=INF,siz[MAXN+5];
void get_zx(int u,int fa,int tot){//求重心
    siz[u]=1;
    int maxx=0;
    for(int i=0;imaxx){
        zx=u;
        zx_maxx=maxx;
    }
}
int dis[MAXN+5],tail;
void get_dis(int u,int fa,int now){//求节点到每一个其他点的距离
    dis[++tail]=now;
    for(int i=0;i>n;
    for(int i=1;i>u>>v>>w;
        g[u].push_back(edge(v,w));
        g[v].push_back(edge(u,w));
    }
    cin>>k;
    zx_maxx=INF;
    get_zx(1,0,n);
    cout<

4. 点一个赞!

Original: https://www.cnblogs.com/ztxcsl/p/15128323.html
Author: ztxcsl
Title: 点分治 学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604835/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaScript定时器的简单运用(暂停,继续)

    1、定时器种类 js定时器有两个方法:1、setInterval() :周期性地执行该方法2、setTimeout() :只执行一次该方法 2、使用方法 两个方法的使用方式相同,以…

    数据结构和算法 2023年6月7日
    0185
  • 再探快速排序 → 递进式演进,是否更容易理解?

    开心一刻 爷爷有退休金,奶奶没有 可奶奶很要强 为了不让爷爷看不起,她找了份环卫的工作 结果要早起,她起不来 现在爷爷每天要早起扫大街 前情回顾 关于快排,楼主之前写过两篇关于它的…

    数据结构和算法 2023年6月7日
    085
  • buuctf-level4

    下载附件打开后,发现是linux下的可执行文件,使用IDA(64)打开,发现与二叉树的遍历顺序有关,如图: 可以发现type1和type2函数即为关键的函数,进去查看发现: __i…

    数据结构和算法 2023年6月7日
    085
  • windows系统命令行cmd查看显卡驱动版本号CUDA

    好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/16656547.html 关于…

    数据结构和算法 2023年6月16日
    0136
  • 二叉树的直径和最大距离问题

    原文地址: 二叉树的直径 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径(边)长度中的最大值。 主要思路: 定义如下数据结构 public stat…

    数据结构和算法 2023年6月12日
    087
  • Django中间件执行顺序

    中间件 Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式…

    数据结构和算法 2023年6月7日
    087
  • 严格次小生成树

    洛谷最优解rank1,u1s1快是真的快,好写是真的好写,理解也很好理解 简直酸爽,舒服了 非原创,仅作解释 严格次小生成树,顾名思义,权值仅仅小于最小生成树 重点解释这个查询 i…

    数据结构和算法 2023年6月7日
    077
  • Linux(一)——安装

    Linux(一)——安装 一、VMware Workstation Pro (一款虚拟机软件) 1.下载 打开网址https://www.vmware.com/cn.html跟着红…

    数据结构和算法 2023年6月7日
    072
  • 【HDU 1069】 Monkey and Banana (基础dp)

    直接写中文了 Problem Statement 一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当…

    数据结构和算法 2023年6月14日
    0120
  • Dreamoon Likes Coloring 【CF 1329 A】

    传送门 思路:”Dreamoon will choose a number p i pi from range 1 ,n −l i +1 and will paint …

    数据结构和算法 2023年6月7日
    089
  • 随笔1

    今后会陆续把我写得随笔发上来吖 可能有些粗拙… 吾辈当自强 不经意间,脑海里闪过大海的壮阔。我喜欢看海,只因这是祖国的造物。海之蓝,美好,纯洁,我的中国梦就如同茫茫大海…

    数据结构和算法 2023年6月7日
    075
  • CF彩笔题解1651 AtoC

    1< Original: https://www.cnblogs.com/zandebokegu/p/15996833.htmlAuthor: szf45Title: CF彩…

    数据结构和算法 2023年6月7日
    083
  • SpringBoot多线程——排队叫号实验模拟(二)

    SpringBoot多线程——排队叫号模拟实验(二) 1. 前言 本文是前面一篇文章的续集。与之前的思路略有出入。先来做个回顾,体检中心需要模拟客户多次排队叫号的流程,现在提出如下…

    数据结构和算法 2023年6月16日
    093
  • 机器学习常用指标

    一、机器学习常用指标 对于一个分类任务,我们预测情况大致如下面混淆矩阵所示: 预测为正样本预测为负样本 标签为正样本 TP FN 标签为负样本 FP TN 1、accuracy a…

    数据结构和算法 2023年6月8日
    079
  • 学习札礼——基础算法

    快速排序算法 基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一轮扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序…

    数据结构和算法 2023年6月7日
    077
  • 二分查找(Java实现)

    有没有正在学数据结构的?没学过C,只会Java的我表示算法好难 ┭┮﹏┭┮。 废话不多说,分享一个很简单的二分查找,在有序数组(从小到大排序)中查找T类型的变量,我就直接用int …

    数据结构和算法 2023年6月7日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球