dsu on tree:关于一类无修改询问子树可合并问题 开始学长讲课的时候听懂了但是后来忘掉了....最近又重新学了一遍 所谓\(dsu\ on\ tree\)就是处理本文标题:无修改询问子树可合并问题. \(dsu\)是并查集,\(dsu\ on\ tree\)是树上启发式合并,基于树剖(轻重链剖分). 无修改好理解,询问子树也好理解,啥是可合并啊? 举个简单的例子,集合的\(gcd\)就是可以合并的,就是两个集合\(gcd\)的\(gcd\):桶也是能合并的,对应位置相加就好了,诸如此类.…
我也不知道为啥这要起这名,完完全全没看到并查集的影子啊…… 实际上原理就是一个树上的启发式合并. 特点是可以在$O(nlogn)$的时间复杂度内完成对无修改的子树的统计,复杂度优于莫队算法. 局限性也很明显:1.不能支持修改  2.只能支持子树统计,不能链上统计.(链上统计你不能直接树剖吗?) 那么它是怎么实现的呢?首先有一个例子:树上每个节点都有一个颜色(那么一定是蓝色), 求每个节点的子树上有多少颜色为k的节点.(每个节点的k不一定相同) $O(n^2)$的算法非常好想,以每个点为起点dfs…
[CF600E]Lomsat gelral(dsu on tree) 题面 洛谷 CF题面自己去找找吧. 题解 \(dsu\ on\ tree\)板子题 其实就是做子树询问的一个较快的方法. 对于子树的询问,我们不难想到子树就是\(dfs\)序上的连续一段, 可以把树转化成序列再用莫队来解. 其实可以对树进行树链剖分,然后暴力+优化来解 具体的做法就是: 递归处理轻儿子,计算轻儿子答案, 然后消去轻儿子对于答案的影响. 然后递归处理重儿子,不消去影响,最后加入所有轻儿子贡献,计算答案. 复杂度?…
这个算法还是挺人性化的,没有什么难度 就是可能看起来有点晕什么的. 大体 思想是 利用重链刨分来优化子树内部的查询. 考虑一个问题要对每个子树都要询问一次.我们暴力显然是\(n^2\)的. 考虑一下优化这个过程,我们发现儿子的信息可以给父亲用但是不能给兄弟或兄弟里的儿子用. 如果是最大最小值我们只能暴力来搞 但如果是出现次数什么的我们可以利用捅差分来解决这个事情. 考虑我们每次先暴力扫轻儿子然后 再做重儿子然后再把轻儿子的代价加上算当前节点的代价然后再把轻儿子的代价给删掉. 我们发现轻儿子被加上…
dsu on tree. \(\rm 0x01\) 前言\(\&\)技术分析 \(\bold{dsu~on~tree}\),中文别称"树上启发式合并"(虽然我并不承认这种称谓),大概是一种优雅的暴力,并且跟\(dsu\)毫无关系.于是我打算叫他\(\bold{Elegantly~Direct~Counting~on~Tree}\),"优雅的树上暴力统计". 严格来说,\(\bold {EDCT}\)解决的问题范围并不广泛: 1.维护子树信息: 2.不能带修改…
dsu on tree,又名树上启发式合并.重链剖分,是一类十分实用的trick,它常常可以作为一些正解的替代算法: 1.DFS序+线段树/主席树/线段树合并 2.对DFS序分块的树上莫队 3.长链剖分(但复杂度会多一个log) 4.点分治(通常可以做有根树的点分治) 重链剖分的概念,用一个DFS找到每个点最大的一个儿子,作为它的重儿子,并将它标记.则从上到下一段连续的标记点就成为一条重链. 重链剖分有一个常用的性质:每个点到根的路径上,至多经过$O(\log n)$条重链.点分治.树链剖分都用…
前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画图看了一天才看懂(我太蒻了),于是就有了这篇学习笔记. 概念篇/基础运用 算法简介 现在考虑这样一类树上统计问题: 无修改操作,询问允许离线 对子树信息进行统计(链上的信息在某些条件下也可以统计) 树上莫队?点分治? \(\text{dsu on tree}\)可以把它们吊起来打! \(\text{…
先瞎扯几句 说起来我跟这个算法好像还有很深的渊源呢qwq.当时在学业水平考试的考场上,题目都做完了不会做,于是开始xjb出题.突然我想到这么一个题 看起来好像很可做的样子,然而直到考试完我都只想出来一个莫队的暴力.当时我想知道有没有比莫队更优的做法,和zbq讨论了半天也只能搞出一个$O(nlog^2n)$的平衡树启发式合并 然后!!我就把这题出给校内互测了!!没错,当时是用莫队当的标算! 结果!mjt用一个假的$O(n)$算法艹过去了因为数据特别水 后来我打算把这题出给另一场比赛,结果到了前一天…
这个属于一种技巧,可以解决类似于子树询问无修改可离线的问题,一些点分治的问题也可以用Dsu on Tree解决,并且常数较小,代码复杂度低,很具有可写性. 整体上的意思就是继承重儿子的信息,暴力修改轻儿子的信息,时间复杂度的证明类似并查集的启发式合并(本质上这个就是启发式合并). 通常情况下,题目长成询问某种东西的数量,或者某种点对的数量. 例题时间 Educational Codeforces Round 2 E Lomsat gelral $n$个点的有根树,以$1$为根,每个点有一种颜色.…
简介 dsu on tree跟dsu没有关系,但是dsu on tree借鉴了dsu的启发式合并的思想. 它是用来解决一类树上的询问问题,一般这种问题有以下特征: \(1.\)只有对子树的查询: \(2.\)没有修改. 如果满足以上特征,那么dsu on tree很可能就可以派上用场了. 算法 我们以CF600E Lomsat gelral为例. Descrption 一棵以\(1\)为根的树有 \(n\) 个结点,每个结点的颜色是\(c_i\),每个颜色有一个编号,求树中每个子树的最多的颜色编…