首页 > 其他分享 >DSU on tree

DSU on tree

时间:2024-04-16 20:45:47浏览次数:24  
标签:子树 DSU tree son 搜索 回溯

今天模拟赛 T2 用到了,所以来浅浅地学一下 DSU on tree。

对于一类树上问题(大多是和路径有关的),其暴力复杂度通常会带上一个 \(n^{2}\),这时利用启发式合并就可以将其优化到 \(n \log n\)。

具体地,假设搜索到了 \(u\) 结点,令 \(son_{u}\) 表示结点 \(u\) 的重儿子,那么:

  1. 先对 \(u\) 的所有非重儿子 \(v(v \not= son_{u})\) 搜索,搜索结束后消除这次搜索带来的影响,或者说回溯,包括但不限于清空桶,撤回标记等等。
  2. 搜索 \(son_{u}\),并且保留这次搜索带来的影响,即不回溯。
  3. 再次对 \(u\) 的所有非重儿子 \(v(v \not= son_{u})\) 搜索。

第一步可以和第二步可以统计出 \(u\) 的每个子树的答案,第三步是为了求出 \(u\) 的信息并统计答案。

因为 \(u\) 的各个信息可以由其子树继承/合并而来,所以我们可以选择一个子树,在其搜索结束后不回溯,直接继承/合并到当前节点来,按照人类智慧来看,我们保留子树大小最大的子树的信息是最划算的,这就是树上启发式合并的精髓。

复杂度证明不会,OI wiki 上的证明看不懂,有没有好心人给我讲讲/kk

标签:子树,DSU,tree,son,搜索,回溯
From: https://www.cnblogs.com/A-box-of-yogurt/p/18139133

相关文章

  • Causal Inference理论学习篇-Tree Based-Causal Tree
    Tree-BasedAlgorithmsTree-based这类方法,和之前meta-learning类的方法最明显的区别是:这类方法把causaleffect的计算显示的加入了到了树模型节点分裂的标准中从response时代过渡到了effect时代。大量的这类算法基本围绕着树节点分裂方式做文章,普遍采用的是兼容性比较高......
  • CF1788F XOR, Tree, and Queries
    CF1788FXOR,Tree,andQueries边权转点权+染色+构造首先对于限制,可以转化。设\(f_u\)表示\(1\)到\(u\)的异或和,那么限制\((u,v,w)\)就可以表示为\(f_u\oplusf_v=w\)。也就意味这如果我们将限制\((u,v,w)\)连边,要考虑的就变成\(f_u\)的赋值问题。这一步将边权转......
  • CF1626E Black and White Tree
    CF1626EBlackandWhiteTree换根dp树上路径行走问题,因其节点的转移不止于其子树有关,一般考虑换根dp或寻找新的转移顺序。在这题里,考虑一个以\(i\)为点的子树,判断\(i\)是否可以走到子树中某个黑点,设\(f_u\)表示\(u\)能否走到黑点,枚举儿子\(v\),有三种满足方式:\(......
  • git worktree与分支依赖隔离
    gitworktree介绍gitworktree 是Git命令,用于管理多分支工作区。使用场景:同时维护不同分支,隔离分支依赖差异:从原有项目开辟一个分支作为另一个新项目,当两个项目依赖差距越来越大时,每次切换分支后都需要重新安装依赖。通过gitworktree可以隔离两个分支的依赖,并且两个分支......
  • npm安装时一直idealTree:npm: sill idealTree buildDeps解决方案
    1.删除用户界面下的npmrc文件(注意一定是用户C:\Users\{账户}\下的.npmrc文件下不是nodejs里面)2.清除缓存,注意不要用npmcacheclean--force,容易出现npmWARNusing--forceIsurehopeyouknowwhatyouaredoing.要用:npmcacheverify3.设置镜像源:npmconfigsetregis......
  • Avalonia下拉可搜索树(TreeComboBox)
    1.需求分析  树形下拉的功能是ComboBox和TreeView的功能结合起来,再结合数据模板来实现这一功能。2.代码实现 1.创建UserControl集成TreeView控件`publicclassTreeComboBox:TreeView{privatebool_isPushTextChangedEvent=true;privateButtonClearButton;pri......
  • py_trees Sequence节点参数: memory=True | False
    Python行为树py_trees的一种注意情况:memory=True|Falsepy_trees…composites.Sequence(name=“root”,memory=True)官方文档是这样写的Ifconfiguredwithmemoryandachildreturnedwithrunningontheprevioustick,itwillproceeddirectlytotherunn......
  • ACCESS TreeView控件的使用
    一.在窗体的设计模式下,选择ActiveX控件,然后找到 MicrosoftTreeViewControl6.0(SP6),确定 二.数据表的设计.重点在处理NodeID与ParentNodeID这两个字段的关系上.  三.TreeView数据的加载.下图是TreeView控件的所有事件.可以看到它本身是没有专用的加载事件的.需要在......
  • DSU
    树上启发式合并适用于维护子树内信息例题:CF246E思路暴力将询问离线下来,挂在每个点上对于每个点\(x\),维护一个桶\(cnt_{dep}\),统计深度\(dep\)下不同字符串出现的次数对于\(x\)上的询问输出\(cnt_{dep_x+k}\)每切换一个\(x\),\(cnt\)要重置\(DSU\)优化维护......
  • 为什么索引结构默认使用B+Tree?为什么需要注意联合索引中的顺序?最左前缀原则是什么?
    (1)为什么索引结构默认使用B+Tree,而不是B-Tree,Hash,二叉树,红黑树?B-tree:B+Tree相比于B-Tree,所有的数据都存储在叶子节点,并且叶子节点之间用指针相连形成了一个有序链表,这有利于范围查询和全表扫描时连续地读取磁盘上的数据,极大地降低了磁盘I/O次数。而在B-Tree中,数据分布在所有节......