首页 > 其他分享 >lg树上操作

lg树上操作

时间:2024-08-20 19:40:13浏览次数:5  
标签:lg 子树 一个点 log 儿子 Solve 操作 树上

lg树上操作

  • P3258

树上差分

  • P1600 [NOIP2016] 天天爱跑步

分开两边处理。

对于上升段,如果一个点深度是 x=dep_i+w_i ,那么 i 就被贡献

我们可以将整个上升段的 x 位置都加,然后在每个点处统计 dep_i+w_i 位置的值。每个点开一个 vector 记录修改操作。不过这样可能会有互相影响的问题,但是鉴于我们只关系一个位置即 dep_i+w_i,我们可记录这个值的变化量。

下降段同理。

  • DFN

子树修改

这样的话,出现这种情况的次数就是 \(\mathcal O(\log n)\)

  • slpf

请注意重链剖分的 dfn 序也满足上面的性质。

  • 转化:寻找影响了哪些节点的思路

P4092 树 --- 转化为子树取 max

由于是单点查询,不需要 segment beats,可以用标记永久化。

成功减小复杂度。

  • 轻重儿子分开维护

  • P5305 [GXOI/GZOI2019] 旧词

去除限制:离线排序处理

范围是小于等于,考虑排序离线去除限制。

若 y 是 v 的重儿子,那么所有 x 对 v 的贡献就是维护的值,否则单独进行贡献,进行一个子树求和。这样大开销的子树求和就不会进行很多次。

而对于插入点的操作,只有走轻边的时候才会修改。

利用的就是 1. 重儿子是唯一的 2. 跳轻边的时候是少的

通常都是维护轻儿子信息。

  • 长链剖分

重儿子改成深度最大的儿子。称长儿子

  1. 一个点的 k 级祖先所在的长链长度至少为 k

  2. u 所在的长链比其短儿子所在的长链长,故 u 到根上的轻边数量是 \(\sqrt n\) 级别的

  • 树上 k 级祖先

这样虽然预处理的时间是和树上倍增一样的,但是它每次查询都是 \(\mathcal O(1)\) 的

  • CF1009F

  • 树上启发式合并 dsu on tree

若求出 x 的答案可以调用 Solve(x)

则 Solve(x) 的工作流程如下

  1. 对每个轻儿子调用 Solve(下面过程5会将其清空)

  2. 对每个重儿子调用 Solve(不会被清空)

  3. 暴力加入轻儿子及其子树对 x 的贡献

  4. 记录 x 的答案

  5. 如果 x 自己是父亲的轻儿子,则清空所有答案

这样就保证时刻存储的都是自己子树的信息。

时间是 \(\mathcal O(n\log n\times T(n))\) \(T(n)\) 是一次修改的复杂度。

  • CF600E

模板

  • 点分治

对一棵树,找到一个点 u,处理所有经过点 u 的路径的信息。

然后把树分成若干部分,然后对于每一个部分继续上述操作,则我们要使得分出的最大部分尽可能小,每一部分都不超过总数的二分之一,这样递归只需要 log 次。

  • P3806 模板点分治

只要考虑计算出如何统计经过点 u 的信息,考虑拼接。

依次扫描每一棵子树,统计有多少深度为 l 的路径,与之前子树存储的进行拼接。

  • 构造一个点集,使得树上所有长度不超过 k 的路径都被覆盖至少一次。

  • 动态点分治/点分树

将点分治的结构存储下来,这样就成为一棵高度为 log 的树。

如果修改一个节点,那么祖先节点都会发生变化。

  • P6329 模板点分树

对这个结构维护若干线段树。查询的时候就跳祖先查询,修改的时候跳祖先修改即可。

  • 虚树

最简单的方式就是关键点之间两两求 LCA

不过,根据 DFN 的性质,只需要求两两相邻的 LCA 即可

我喜欢的方法:

性质:如果一个点本身不是关键点,那么它至少有两个儿子。所以总共节点数目不超过 2m

  • 典中点 消耗战

标签:lg,子树,一个点,log,儿子,Solve,操作,树上
From: https://www.cnblogs.com/haozexu/p/18370157

相关文章

  • MySQL操作
    数据库类型常用数据类型详细数据类型需要注意的是:BOOLEAN在数据库保存的是tinyInt类型,false为0,true就是1char是定长,varchar是变长,char存储时,如果字符数没有达到定义的位数,后面会用空格填充到指定长度,而varchar没达到定义位数则不会填充,按实际长度存储。比如一个char(1......
  • TreeView和ListView数据库查询数据联动操作
    好久不用了,重新整理下放这里以备需要使用,功能见图数据库表结构定义TreeViewaddObject中data存储的记录集typePNode=^TNode;TNode=recordid:Integer;tcmc:string;mxid:string;end;填充TreeView代码procedureTForm1.FillTree(TreeV......
  • 《面板变系数模型及 Stata 具体操作步骤》
    目录一、文献综述二、理论原理三、实证模型四、稳健性检验五、程序代码及解释六、代码运行结果一、文献综述在经济和社会科学研究领域,面板数据模型因其能够同时考虑个体和时间维度的信息而被广泛应用。传统的面板数据模型通常假设系数是固定的,但现实中,系数可能会随......
  • 汇编语言之门:深入I/O操作的迷宫
    标题:汇编语言之门:深入I/O操作的迷宫在计算机的微观世界中,汇编语言以其与硬件的紧密联系而著称。输入输出(I/O)操作是汇编语言程序中与外部世界交互的重要手段。本文将带你深入探索汇编语言中的I/O操作,揭示其背后的原理,并展示如何通过代码实现基本的I/O功能。汇编语言与I/O操......
  • 汇编语言之门:深入I/O操作的迷宫
    标题:汇编语言之门:深入I/O操作的迷宫在计算机的微观世界中,汇编语言以其与硬件的紧密联系而著称。输入输出(I/O)操作是汇编语言程序中与外部世界交互的重要手段。本文将带你深入探索汇编语言中的I/O操作,揭示其背后的原理,并展示如何通过代码实现基本的I/O功能。汇编语言与I/O操......
  • 第3篇 :git 首次创建项目上传,代码合并操作
    一.首次创建远程代码库,并上传自己修改的本地代码第1步:在自己电脑创建本地项目路径,在这个路径下执行初始化git:命令:gitinit第2步:改分支名称【如果远程仓库,主干的名称是main,而不是master,需要在本地将master改为main,如果主干已经是main则可忽略此步骤,这种情况只出现在gitlab代码......
  • 一款专为内网办公环境设计的操作系统,集成了Word、Excel、PPT、PDF编辑器,内网聊天、白
    前言在当今数字化办公时代,企业面临着多样化的办公需求。现有软件往往存在一些痛点,如操作复杂、兼容性差、资源消耗高,以及在内网环境下的通讯和文件共享不便。这些限制不仅影响了工作效率,也制约了企业的数字化转型。因此,一款能够处理这些问题的软件显得尤为迫切。介绍GodoOS......
  • 致命错误:您当前未在任何分支上操作" - 分支管理指南与解决方案
    fatal:youarenotcurrentlyonabranch在Git中,fatal:youarenotcurrentlyonabranch 是一个常见的错误提示,通常发生在你尝试进行提交(commit)或推送(push)操作时,但你当前并未处于任何分支(branch)上。理解错误原因Git是一个分布式版本控制系统,它允许多个开发者同时在同一......
  • 《篮球比赛展示管理平台》 现场管理员角色操作说明书V2.1
    说明篮球比赛现场管理员,是篮球比赛展示管理后台的现场操作角色。如果现场管理员身兼其它角色,那么其最终的角色权限就是其拥有的所有角色的访问资源的允许权限的并集。登录平台后,其最小的授权主菜单如下: 现场管理员角色最小的任务子集(PC端)此处的[最小的任务子集]指,现场管......
  • 5.现场正式操作流程-《篮球比赛展示管理系统》现场管理员角色操作手册
    第1步:数据清零操作点击控制台菜单[赛前操作]中,有三个清零命令,一般选择[赛前操作>全部清零],见下方示意图:  后两个清零用在特殊情况下。由于前期测试时,里面已有相关统计数据,所以在正式比赛之前,最好[清零]一下,保证初始状态是干净状态。第2步:标语及主题画面展示现场管理员......