首页 > 其他分享 >【学习笔记】长链剖分

【学习笔记】长链剖分

时间:2023-04-22 22:23:31浏览次数:51  
标签:长链 剖分 int 笔记 LCA mathrm mxdep

简述

在常规树链剖分中把重儿子设成 \(siz\) 最大的儿子,这样从根跳重链时子树大小至少减半,因此只需要 \(O(\log n)\) 次即可到达任何节点。

考虑把关键字由 \(siz\) 改成子树内最大的深度 \(dep\),这样的剖分方法称为长链剖分。

void dfs1(int u,int fa,int d){
    dep[u]=d,mxdep[u]=dep[u];
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==fa) continue;
        dfs1(v,u,d+1);
        if(mxdep[v]>mxdep[u]) mxdep[u]=mxdep[v],son[u]=v;
    }
}

长链剖分具有一些性质:

  • 从一个节点跳向链顶的父亲,所在的链长度一定增加,证明显然。

  • 从一个节点跳链顶,\(O(\sqrt{n}) 次可以到达树根\),结合上一性质可证,最坏情况是 \(1+2+\cdots+\sqrt{n}\)。但这个性质不常用。

优化 DP

大致思想

当 DP 的状态形如 \(f_{u,d}\),只与子树 \(u\) 和子树内到 \(u\) 的距离 \(d\) 有关时,可以考虑长链剖分优化至 \(O(n)\)。

具体方法类似树上启发式合并,每次继承重儿子信息,轻儿子暴力合并。

复杂度证明:短链向长链合并时,长链长度一定不会增加,因此相当于把短链上的信息直接删去了。而一条链只会合并一次,每个节点只出现在一条链上,因此合并复杂度是 \(O(n)\) 的。

具体实现

难点在于如何继承重儿子的信息。

在绝大多数题目中,是一个 \(f_{v,d}\to f_{u,d+1}\) 的过程,也就是由父亲到儿子,距离增加 \(1\)。可以使用指针实现,先 DFS 预处理,对于根和每个轻儿子开子树内最大距离大小的空间,对于重儿子将指针设为父亲的指针位置加 \(1\)。

void dfs2(int u,int f){
    if(u==1){
        dp[u]=p,p+=mxdep[u]-dep[u]+1;
    }
    if(!son[u]) return;
    dp[son[u]]=dp[u]+1;
    dfs2(son[u],u);
    for(int i=head[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==f||v==son[u]) continue;
        dp[v]=p,p+=mxdep[v]-dep[v]+1; 
        dfs2(v,u);
    }
}

在一般情况下,每个数组大小就是 \(n\)。

也可以用 vector 实现,但是每次加入距离更小的,实际上是倒着存储,需要特判一些边界等等,且常数较大,不推荐。

在正式 DP 时,要利用好只能枚举短链上节点到 \(u\) 的距离。对每棵子树单独计数的题目,直接继承即可,且对于最值或求和之类的题目,会影响到的只有短链的范畴;对于多棵子树合并计数的题目,注意到一定有短链存在,因此还是以枚举短链上距离为依托。

例题

CodeForces-1009F Dominant Indices *2300

朴素的统计子树内距离对应节点个数。

重儿子可以直接继承,轻儿子暴力合并即可。

洛谷-P5904 [POI2014] HOT-Hotels 加强版

这类的三元组有两种:\(\mathrm{LCA}\) 是或不是重心的。

先考虑朴素 DP 怎么做,我们希望问题在子树内解决,所以要在 \(\mathrm{LCA}\) 处统计答案。

对于第一种情况,设 \(f_{u,d}\) 为 \(u\) 子树内距离为 \(d\) 的节点个数,\(g_{u,d}\) 为 \(u\) 子树内到 \(u\) 距离均为 \(d\) 且 \(\mathrm{LCA}\) 为 \(u\) 的点对数。

枚举每棵子树以及距离,统计答案的过程:

\[g_{u,d+1}\times f_{v,d}\to ans \]

\[f_{u,d+1}\times f_{v,d}\to g_{u,d+1} \]

\[f_{v,d}\to f_{u,d+1} \]

对于第二种情况,设目标三元组 \((u,v,w)\),有三部分组成:\(\mathrm{LCA}(u,v)\) 到 \(u,v\) 距离相等,均为 \(d_1\),\(\mathrm{LCA}(u,v,w)\) 到 \(w\) 的距离 \(d_2\) 与到 \(\mathrm{LCA}(u,v)\) 的距离 \(d_3\) 无边集交且满足 \(d_1=d_2+d_3\)。

因为在 \(\mathrm{LCA}(u,v,w)\) 处统计答案,发现 \(d_3=d_1-d_2\),因此 \(d_1-d_2\) 相等的位置本质没有区别,设 \(h_{u,d}\) 为 \(u\) 子树内满足这样情况且 \(d_1-d_2=d\) 的点对数,那么转移也类似上面了。

考虑怎么优化。

\(g\) 是只对一棵子树有效的,不需要继承,\(f\) 比较朴素的继承即可,而 \(h\) 比较不同,考虑到 \(v\) 到 \(u\) 后,\(d_1\) 不变而 \(d_2\) 增加 \(1\),因此继承是形如 \(h_{v,d}\to h_{u,d-1}\),与正常的继承不同。这就需要我们预处理指针时,把重儿子的指针设为父亲的指针减 \(1\),从而空间要开 \(2\) 倍。

统计答案也需要精细处理,一个简单的想法是先计算轻子树之间的答案,这部分照搬暴力即可,同时要用一个临时数组记录一下当前统计到的 \(f,g,h\)。计算完之后,可以和重儿子继承来的 \(f,h\) 再合并得到另一部分的答案。

标签:长链,剖分,int,笔记,LCA,mathrm,mxdep
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_Long_Chain_Tree_Decomposition.html

相关文章

  • JSP程序设计_全程_老师笔记
    ​2.21笔记 一、网页的组成元素      网页一般是由内容、样式和布局、动效三部分组成的。            内容(HTML)主要指的是页面的文字、按钮button、图片img、视频video、音频audio等等            样式和布局(CSS)指的是内容的大小、颜......
  • 51单片机学习笔记 STC89C52RC (05)矩阵键盘和独立键盘(轻触开关)
    按键抖动,需要消抖 原理图来自清翔电子一、独立键盘模块1.可以直接获取 P3^0对应S2 P3^1对应S3 P3^2对应S4 P3^3对应S5 的电压当轻触开关按下时,电流会流向GND,此时这一路的电压为0V,松开轻触开关,又变为5V //第一种方法:单个I/O口检测控制#include<reg51.h>sbi......
  • 【读书笔记】ISBN9787121353932
     【前言】是否所有人都可以公平地享受科技发展带来的生产力进步?AIGC应用越完善,内容生产的社会必要劳动时间就越少,人工就越没有价值。全社会新增劳动岗位的速度很快就会跟不上AIGC应用取代人工的速度,而不会使用AIGC应用的劳动者可能将无法获得收入、无法进行消费,从而逐步被剥离......
  • 仅1cm厚!华硕发布全球最薄13.3英寸笔记本
    近日,华硕发布了新款ZenbookS13OLED,官方称其为世界最纤薄的13.3英寸OLED笔记本电脑。据悉,这款电脑的厚度仅有1cm,重量也仅有1kg,相较其他同尺寸的笔记本,确实更加轻薄。材质上,这款笔记本采用了华硕独有的等离子陶瓷铝材料盖板,并采用了回收金属和塑料。在这样的体积内,ZenbookS1......
  • Django笔记十二之defer、only指定返回字段
    本文首发于公众号:Hunter后端原文链接:Django笔记十二之defer、only指定返回字段本篇笔记将介绍查询中的defer和only两个函数的用法,笔记目录如下:deferonly1、deferdefer的英语单词的意思是延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获......
  • extends笔记
    JavaScript面向对象继承extends1.概念(主要用途)将子类中的共性代码(属性和方法)抽取出来放到父类中每当有一个新的子类需要用到共性的属性或者方法时不需要在自己内容复写一遍只需要继承父类的代码2.继承的优点与缺点2.1优点实现代码复用共性代码不需要......
  • 计组笔记:第三章 存储系统
    第三章存储系统【复习提示】本章是历年考査的重点,特别是有关Cache和存储器扩展的知识点容易出综合题。此外,存储器的分类与特点,存储器的扩展(芯片选择、连接方式、地址范围等),低位交叉存储器,Cache的相关计算与替换算法,虚拟存储器与快表也容易出选择题。读者应在掌握基本原理和......
  • 计组笔记:第四章 指令系统
    第四章指令系统【复习提示】指令系统是表征一台计算机性能的重要因素。读者应注意扩展操作码技术,各种寻址方式的特点及有效地址的计算,相对寻址有关的计算,CISC与RISC的特点与区别。本章知识点出选择题的概率较大,但也有可能结合其他章节出有关指令的综合题。2014年、2015年已连......
  • 计组笔记:第五章 中央处理器
    第五章中央处理器【复习提示】中央处理器是计算机的中心,也是本书的难点。其中,数据通路的分析、指令执行阶段的节拍与控制信号的安排、流水线技术与性能分析易出综合题。而关于各种寄存器的特点、指令执行的各种周期与特点、控制器的相关概念、流水线的相关概念也极易出选择题......
  • 计组笔记:第六章 总线
    第六章总线【复习提示】本章的知识点较少,其中总线仲裁及总线操作和定时方式是难点。本章内容通常以选择题的形式出现,特别是系统总线的特点、性能指标、各种仲裁方式的特点、异步定时方式及常见的总线标准和特点等。总线带宽的计算也可能结合其他章节出综合题在学习本章时,请读......