首页 > 其他分享 >树上启发式合并

树上启发式合并

时间:2024-02-04 12:44:06浏览次数:25  
标签:遍历 log 轻边 合并 儿子 启发式 树上

启发式合并

定义

在并查集和树上处理离线问题的算法,主要思想是把小集合并到大集合上

做法

树上颜色:一棵树,每个节点都有一个颜色,给定 m 次询问,问以 x 为根的子树有多少种不同的颜色。

轻重剖分,只需要记录重儿子即可。先遍历轻儿子,不计修改。再遍历重儿子,计入修改。最后再遍历轻儿子(dfs序列简化,遍历序列),统计出 root 的答案。再根据递归时要不要计入修改来算。

复杂度

对于重儿子,只会访问一次。对于轻儿子要访问多次。考虑一个点到根的路径上的轻边数量,每多一条轻边,则会被遍历一次,多统计一下。轻边个数最多为 \(O(\log n)\) 条(见重链剖分)。而因为这个点自身答案需要统计故访问次数最多为 \(\log n + 1\),总复杂度为 \(O(n(\log n+1))=O(n \log n)\)

练习题

Lomsat gelral

快乐游戏鸡

XOR Tree

参考资料

CSDN

OI-Wiki

标签:遍历,log,轻边,合并,儿子,启发式,树上
From: https://www.cnblogs.com/life-of-a-libertine/p/18005971

相关文章

  • Object.assign详解(对象的浅拷贝以及合并)
    Object.assign详解 一、Object.assign是什么?首先了解下Object.assign()是什么。我们先看看ES6官方文档是怎么介绍的?Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。简单来说,就是Object.assign()是对象的静态方法,可以用......
  • 简单树上问题
    1.树的重心树的重心是无根树上的一个应用。满足以下性质的点\(u\)为树的重心:删除结点\(u\)即与它相连的边,如果在剩下的两棵或多课子树中最大子树的结点数最少,那么\(u\)就是树的重心。例1POJ-3107翻译本题的教父就是树的重心。接下来分析方法。首先是暴力法。枚举一......
  • # yyds干货盘点 # 盘点一个txt文档合并的实战需求(方法二)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【FiNε_】问了一个Pandas数据合并的问题。问题如下图所示:上一篇文章中我们已经看到了两个方法,这一篇文章我们一起来看看另外一个方法。二、实现过程这里【哎呦喂 是豆子~】给了一个指导,如下所示:并给出了如下代码:importpand......
  • 合并两个有序数组
    88.合并两个有序数组问题描述:给定两个有序整数数组nums1和nums2,将nums2合并到nums1中,使得num1成为一个有序数组。说明:初始化nums1和nums2的元素数量分别为m和n。你可以假设nums1有足够的空间(空间大小大于或等于m+n)来保存nums2中的元素。示例:输......
  • 2022CCPC女生赛-L.彩色的树(线段树合并)
     链接Problem-L-Codeforces以前迷迷糊糊用dsuontree写的题目但是其实没搞明白现在换一种写(太菜了还是没搞明白dsuontree)题意:给你一棵树,询问给定询问的节点上,子树内距离小于等于k的节点不同颜色的种类有多少个。k是固定的值。解法:本题做法为比较板子的线段树合并,......
  • # yyds干货盘点 # 盘点一个txt文档合并的实战需求(方法一)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【FiNε_】问了一个Pandas数据合并的问题。问题如下图所示:二、实现过程这里【隔壁......
  • 盘点一个txt文档合并的实战需求(方法一)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【FiNε_】问了一个Pandas数据合并的问题。问题如下图所示:二、实现过程这里【隔壁......
  • 3、git命令从develop分支合并到master分支
    git命令从develop分支合并到master分支1、拉取develop分支的代码gitcheckoutdevelop//切换成本地分支gitpullorigindevelop//拉取远程开发分支gitadd.//暂存到本地仓库gitcommit-m//增加备注信息gitpushorigindevelop//推送到远程仓库gitcheckoutmaster......
  • ELK根据字段拆分合并
     input{beats{port=>5044}}filter{multiline{#pattern=>"^\d{4}-\d{2}-\d{2}"#正则表达式模式,匹配时间戳开头的行pattern=>"^Application_Stdout"#匹配以"Application_Stdout"开头的行negate=>true#反转匹配结果,匹配非时间......
  • leedcode 合并两个有序数组 切片 原地修改
    使用nums1[:m+n]=nums1_new时,这是在原地修改nums1列表。具体来说,这个语句使用切片将nums1中前m+n个元素替换为nums1_new中的元素。这样做的结果是,nums1的原始内存空间被修改,而不是创建一个新的列表对象。使用nums1=nums1_new,这将创建一个新的列表对象,并让nu......