随笔分类 - 算法->图论->树->点分治
摘要:题解 点分治,然后每个点上挂着一个距离不超过$a_{i}$的颜色改成$c$ 用一个单调栈维护距离单调递减,每次查询在每个包括这个点的分治中心的单调栈上二分,找到修改最靠前的颜色作为这个点的颜色 代码 cpp include define fi first define se second defin
        阅读全文
                
摘要:"原题链接" 题解 查询距离一个点距离在一定范围内的点,直接点分树,前缀和用树状数组维护 答案是当前重心距离不超过k (x到重心距离)的点的前缀和,减去在x所在子树中,距离重心不超过k (x到重心距离)的前缀和 代码 cpp include define fi first define se sec
        阅读全文
                
摘要:"原题链接" 题解 距离省选只有一周了我居然才开始数据结构康复计划 这题很简单,就是点分树,然后二分一个值,我们计算有多少条路径大于这个值 对于一个点分树上的重心,我们可以通过双指针的方法求出它子树里的路径任意搭配大于这个值的方案 然后同一个子树里重复计算的删掉 再计算和自己祖先之间的路径 代码
        阅读全文
                
摘要:题解 一道我觉得和二叉树没有关系的题…… 因为直接上点分就过了,虽然很慢,而且代码很长 你需要记录一个点分树,对于每个点分树的重心,记录一下上一次进行分割时树的重心以及这个重心和上一次重心所连接的点以及连接的边的距离 然后计算这个重心和所在的树到上一个重心节点路径和的前缀和,还有节点个数和 处理每棵
        阅读全文
                
摘要:题解 按秩合并怎么清数组对我来说真是世纪性难题 我们很熟练地想到点分,如果我们认为某个点到重心是正着读的,由于它的深度固定,它的串也是固定的,我们只要预处理出所有长度正着重复的串,反着重复的串,和它们的哈希值,遍历树的时候只需要记录一下路径字符串的哈希值,比对一下看是否合法就行 为了快一点可以按深度
        阅读全文
                
摘要:题解 一眼就是线段树维护点分树的dfs序嘛 代码debug一年(手动再见) 码力直线下降,坐等滚粗= = 很明显的我们需要一个点分树,然后求出以每个重心为根的树的dfs序,线段树维护一下每个点的价值 每个点到根的距离 对于修改点直接单点修改,对于边相当于修改了一个子树到根的距离,就是dfs序上一段区
        阅读全文
                
摘要:题解 最大异或和,明显是个线性基 然而还有那么多路径……那就树分治,反正点数看起来很少,就是为了让人乘上一个60的常数嘛 把一个树的点分树记录下来,然后看看询问的两个点彼此相同的最后一个父亲是谁,把这个询问挂在这个点上,计算就暴力搜索这棵树里每一个节点到重心的线性基就行了,最后再用60的常数把两个线
        阅读全文
                
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号