线段树分治学习笔记
1|0线段树分治
线段树分治是一种可以离线处理带撤销问题的常用手段。一般而言,题目中加入操作很好维护,但删除操作不好维护,这时可以对时间维建线段树,把每一个操作加入其存在时间段对应的线段树节点上,然后处理所有询问,进入一个节点时将这个节点里的操作加入,递归左右儿子,然后撤销这一次做的操作,在线段树根节点处统计答案。因为要支持可以撤销操作,因此一般是将所有操作的逆操作做一遍或者配合可撤销并查集等可撤销数据结构使用。
线段树分治虽然只能离线,但是可以解决一些“伪在线”的题目,比如如果一次操作合法就进行,否则不进行,这种问题可以在处理叶子结点
一些例题:
1|1动态加删边和二分图判定
判断二分图的方式有很多,一个比较有拓展性的方法是拓域并查集,即如果存在
1|2[省选联考2023] 人员调度
把原来的操作改成:树上每个点先有
瓶颈在于复杂度是
1|3P9130 [USACO23FEB] Hungry Cow P
题意:Bessie 很饿,每天晚饭如果有干草就会吃
每天早上 Farmer John 会给它送若干干草,设第
思路:很类似楼房重建的 trick。
我们先离散化,然后考虑用线段树维护。每个节点维护 4 个信息,总共匹配了多少个值,总共向右超出了多少个值,匹配的答案是多少,左区间超出部分的答案。
在合并时,有两种情况,一种是左边超出部分在右区间依然超出,此时右区间被填满了;否则就在右区间线段树上二分,求出最后一个左区间超出部分的位置。
实际上直接线段树分治然后用可持久化代替撤销也可以过。
1|4CF938G Shortest Path Queries
题意:给出一个连通带权无向图,边有边权,要求支持
思路:首先考虑没有修改的做法。我们可以求出一棵生成树,然后把非树边形成的环加入线性基,然后求两点路径异或和和线性基可以异或得到的最小值。
有了加删边,我们就可以考虑用线段树分治,实时维护当前的联通块中每个点到根的异或和,同时维护线性基就可以了。
1|5CF576E Painting Edges
题意:给定一张
一共有
定义合法状态为仅保留染成
有
但并不是每次操作都会被执行,只有当执行后仍然合法,才会执行本次操作。
你需要判断每次操作是否会被执行。
思路:“伪在线” 线段树分治模版题。
我们可以维护
1|6CF603E Pastoral Oddities
题意:依次加边,判断是否存在一个边集满足每个点的度数均为奇数,最小化最大边权。
思路:首先可以发现充要条件:每个联通块大小都是偶数。
因为要最小化最大边权,这很像最小瓶颈生成树,可以用 Kruskal 算法,于是如果不带修改的话可以把所有边从小到大加入,维护奇联通块个数。
带加边可以考虑用线段树分治。容易发现,如果一条边当前没用了,以后也不会再用上,于是每条边做贡献的是一段区间。考虑先往右递归,递归到叶子就可以求出一条边是否不会再做贡献了,这样就可以求出一条边做贡献的区间。
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18014166.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2023-02-12 NOIP2022游记
2023-02-12 CF1167G题解