首页 > 其他分享 >树分块学习笔记

树分块学习笔记

时间:2023-08-18 20:22:39浏览次数:33  
标签:frac 分块 复杂度 笔记 选取 学习 LCA 节点

思想

树分块是一种能解决部分操作树上一条链的一种算法。

回忆下序列上的分块,其最精髓的地方在于将序列分成许多段,如果操作的区间包括了某一段,则直接使用整体处理这一段。我们也要使用某种方法使得操作的链也被分成许多块,但像 dfs 序等并不一定能保证整段的大小稳定。

先设定一个阈值 \(S\),我们要求每一段链的长度接近 \(S\)。一种方法是随机选取 \(\frac n S\) 个点,期望每一段的长度是 \(S\),但是太过玄学,便不使用这种方法。我们先处理出每个节点的深度及其祖先,若当前没有遍历的最深节点的 \(1\sim S\) 级祖先都没有被选取,则将其 \(S\) 级祖先选取。因为深度从大到小遍历,所以每个选取的点至少会覆盖 \(S\) 个节点,所以至多会有 \(\frac n S\) 个节点被选取,称这些被选取的点为关键点。而相邻两个关键点(需满足这两个点的 \(LCA\) 为其中一个点)间的链便相当于序列上分块的整段。

接下来处理出关键点间两两的答案(两点间仍需满足这两个点的 \(LCA\) 为其中一个点),为了防止查询时时间复杂度过大。预处理的时间复杂度为 \(O(\frac {n^2}{S^2}W)\),其中 \(W\) 为合并两段区间答案的复杂度。

剩下按照分块的套路,同时将整块答案与散块答案相加即可。具体而言,就是先找到 \(u,v\) 的 \(LCA\),分别处理 \(u\sim LCA,v\sim LCA\) 即可。(有的题目中需要注意 \(LCA\) 不能被算两次)

实战

P6177 Count on a tree II/【模板】树分块

bitset 来表示有哪些颜色出现过,合并的时间复杂度为 \(O(\frac n \omega)\)。

标签:frac,分块,复杂度,笔记,选取,学习,LCA,节点
From: https://www.cnblogs.com/lyz09-blog/p/study-tree-block.html

相关文章

  • Netty源码学习2——NioEventLoop的执行
    系列文章目录和关于我零丶引入在《Netty源码学习1——NioEventLoopGroup的初始化》中,我们学习了NioEventLoopGroup和NioEventLoop的初始化,在下面netty服务端启动的demo中会在ServerBootStrap中指定Channel为Nio类型的Channel,然后启动的时候绑定端口,之前我们解释道NioEventLoop......
  • openGauss学习笔记-43 openGauss 高级数据管理-事件触发器
    openGauss学习笔记-43openGauss高级数据管理-事件触发器触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。43.1语法格式创建事件触发器。CREATEEVENTTRIGGERnameONevent[WHENfilter_variableIN(filter_value[,...])......
  • .NET Core基础到实战案例零碎学习笔记
    前言:前段时间根据[老张的哲学]大佬讲解的视频做的笔记,讲的很不错。此文主要记录JWT/DI依赖注入/AOP面向切面编程/DTO/解决跨域等相关知识,还包含一些.NETCore项目实战的一些案例。我是西瓜程序猿,感谢大家的支持!一、ASP.NETCore基础1.1-.NETCore概述1.1.1-.NETCroe简介(1......
  • C学习7
    1、取出整数各位数字#include<stdio.h>voidseparate(intn){if(n>9){separate(n/10);}printf("%d",n%10);}intmain(){unsignedintnum=0;printf("请输入需要分解的数字:");scanf_s("%d",......
  • Redis安装配置使用笔记
    Redis是一个基于内存的key-value结构数据库基于内存存储,读写性能高适用于存储热点数据(热点商品,资讯,新闻,秒杀系统) 1.使用Redis1.在Linux上安装Redis 2.在win系统安装直接解压即可  3.启动RedisLinux中在Redis目录下的src目录下直接运行 ./redis-server 4.连接Redis服务Linu......
  • PHP反序列化笔记(二)
    漏洞原理序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。当传给unserialize()的参数可控时,可以通过传入一个精心构造的序列化字符串,从而控制对象内部的变量甚至是函数。存在漏洞的思路:一个类用于临时将......
  • RAM、ROM、SRAM、DRAM、FLASH等常见存储器学习记录
    存储器按照掉电失去数据分为两类:易失性和非易失性。RAM:随机存取存储器(英语:RandomAccessMemory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个......
  • 算法学习笔记
    来源排序算法冒泡排序遍历数组每次遍历到的元素和下一个元素比较,如果出现大于下一个,则交换一趟遍历就能使一个元素到它应当出现的地方图示:图片源自知乎代码:voidbubbleSort(intarr[],intn){for(inti=0;i<n-1;i++){//进行n-1轮排序,因为要和......
  • 笔记整理--C语言--C语言指针5分钟教程——转载
    C语言指针5分钟教程指针、引用和取值什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可......
  • Microsoft Quantum Computing Fundamentals (MS QCF)​读书笔记
    1.学习目标准备开发环境,以便在Q#中编写量子程序。了解Q#程序的结构。使用量子比特和叠加来构建量子随机数生成器。了解Azure昆腾如何使你能够在量子硬件上运行程序。2.准备工作申请一个微软账号,会有500美金的免费额度用于创建工作区和量子使用费用。3.创建Azure量......