首页 > 其他分享 >线段树分治学习笔记

线段树分治学习笔记

时间:2024-02-12 21:44:08浏览次数:28  
标签:线段 分治 撤销 干草 笔记 操作 可以

线段树分治

线段树分治是一种可以离线处理带撤销问题的常用手段。一般而言,题目中加入操作很好维护,但删除操作不好维护,这时可以对时间维建线段树,把每一个操作加入其存在时间段对应的线段树节点上,然后处理所有询问,进入一个节点时将这个节点里的操作加入,递归左右儿子,然后撤销这一次做的操作,在线段树根节点处统计答案。因为要支持可以撤销操作,因此一般是将所有操作的逆操作做一遍或者配合可撤销并查集等可撤销数据结构使用。

线段树分治虽然只能离线,但是可以解决一些“伪在线”的题目,比如如果一次操作合法就进行,否则不进行,这种问题可以在处理叶子结点 \([l,l]\) 时,如果合法就新加入一个 \([l+1,r]\) 的操作,而这个操作对当前并不会造成影响,因此这样做是正确的。

一些例题:

动态加删边和二分图判定

判断二分图的方式有很多,一个比较有拓展性的方法是拓域并查集,即如果存在 \((x,y)\),那么就将 \(x,y+n\) 和 \(x+n,y\) 所在并查集合并,如果 \(x,y\) 已经在同一个并查集里,那么就说明原图不是二分图(因为这样就意味着出现了奇环),而并查集又是可以撤销的,于是可以直接用线段树分治套可撤销并查集。

[省选联考2023] 人员调度

把原来的操作改成:树上每个点先有 \(siz_x\) 的容量,每加一个工厂就把 \(x\) 到根路径上的容量减 1,如果加入后有 -1 了就把深度最大的为 -1 的点的子树里贡献最小的工厂的贡献减掉,这样就可以很好用树剖维护。我们发现不好处理删除操作,于是考虑按时间轴分治,这样就可以很好解决删除的问题。

瓶颈在于复杂度是 \(O(n\log^3n)\) 的,于是就考虑使用全局平衡二叉树把树剖降成单 log,这样就是 \(O(n\log^2n)\) 的。

P9130 [USACO23FEB] Hungry Cow P

题意:Bessie 很饿,每天晚饭如果有干草就会吃 \(1\) 份,没有就不吃,初始没有干草。

每天早上 Farmer John 会给它送若干干草,设第 \(k\) 天送 \(a_k\) 份干草,初始时 \(a_k=0\),表示该天不送干草。

\(q\) 次操作,每次给出 \(x,y\),表示将 \(a_x\) 改成 \(y\),请将在此时 Bessie 有干草吃的 日期编号 求和并输出。对 \(10^9+7\) 取模。

思路:很类似楼房重建的 trick。

我们先离散化,然后考虑用线段树维护。每个节点维护 4 个信息,总共匹配了多少个值,总共向右超出了多少个值,匹配的答案是多少,左区间超出部分的答案。

在合并时,有两种情况,一种是左边超出部分在右区间依然超出,此时右区间被填满了;否则就在右区间线段树上二分,求出最后一个左区间超出部分的位置。

实际上直接线段树分治然后用可持久化代替撤销也可以过。

CF938G Shortest Path Queries

题意:给出一个连通带权无向图,边有边权,要求支持 \(q\) 个操作:

\(1\) \(x\) \(y\) \(d\) 在原图中加入一条 \(x\) 到 \(y\) 权值为 \(d\) 的边

\(2\) \(x\) \(y\) 把图中 \(x\) 到 \(y\) 的边删掉

\(3\) \(x\) \(y\) 表示询问 \(x\) 到 \(y\) 的异或最短路

思路:首先考虑没有修改的做法。我们可以求出一棵生成树,然后把非树边形成的环加入线性基,然后求两点路径异或和和线性基可以异或得到的最小值。

有了加删边,我们就可以考虑用线段树分治,实时维护当前的联通块中每个点到根的异或和,同时维护线性基就可以了。

CF576E Painting Edges

题意:给定一张 \(n\) 个点 \(m\) 条边的无向图。

一共有 \(k\) 种颜色,一开始,每条边都没有颜色。

定义合法状态为仅保留染成 \(k\) 种颜色中的任何一种颜色的边,图都是一张二分图。

有 \(q\) 次操作,第 \(i\) 次操作将第 \(e_i\) 条边的颜色染成 \(c_i\)。

但并不是每次操作都会被执行,只有当执行后仍然合法,才会执行本次操作。

你需要判断每次操作是否会被执行。

思路:“伪在线” 线段树分治模版题。

我们可以维护 \(k\) 个拓展域并查集来判断是否满足条件。我们递归到叶子的时候,如果当前操作可以执行,那么就加入这个操作,新加入的操作是不会影响前面的情况的,我们相当于是可以在线添加操作。

标签:线段,分治,撤销,干草,笔记,操作,可以
From: https://www.cnblogs.com/Xttttr/p/18014166

相关文章

  • 快速幂学习笔记
    我们不妨先来看一道例题了解一下快速幂:【模板】快速幂Atemplate.观察到数据,\(a,b\le2^{31}\),普通的乘法是肯定不行的。因此考虑优化:快速幂。什么是快速幂?顾名思义,就是快速地求出幂(\(a^b\))。怎么快速地求出幂?将\(a^b\)展开,可得:\[a^b=\underbrace{a\timesa\timesa......
  • 【笔记】矩阵快速幂
    前置芝士快速幂。什么是矩阵?矩阵,是由\(\begin{bmatrix}\end{bmatrix}\)组成的一个方阵(就这么理解好啦)。比如:\(\begin{bmatrix}1&2\\3&4\end{bmatrix}\)是一个\(2\times2\)的矩阵。矩阵乘法矩阵乘法的条件:仅当第\(1\)个矩阵的列数\(=\)第\(2\)个矩阵的行数才有......
  • boruvka 算法学习笔记
    boruvka算法就是最小生成树B算法。B算法的思路是每次对每个连通块,求出它能连出去的权值最小的边,然后再按边权从小到大合并。由于每次操作连通块数至少减半,所以复杂度是\(O(m\logn)\)。1.CF1305GKuroniandAntihype题意:长为\(n\)的数列\(a\),现在要选择全部数,每一次你......
  • C++——异常处理模块笔记
    异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况。异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误、访问无效内存等。C++提供了一套异常处理机制,使得程序可以优雅地处理这些异常,提高程序的可靠性和健壮性。异常是一种程序......
  • 江禾:零散媒体笔记
    零基础绘画练习排线,整齐几何体进阶把想画的东西画像,不断观察修改提高自己审美,分析好看的画为什么好看眼睛和画面要平行明确线条才能进步混剪素材预告片欧美预告片YouTube、Bilibili搜电影搜电影的替代网站纪录片《电影史话》《出神入化:电影剪辑的魔力》《工......
  • 二十八、实践中前端的一些笔记
    display:flex/inline-flex使用了display:flex/inline-flex属性后,子元素横向排列使用了display:flex属性后,父元素不设置宽度,宽度就是100%;不会被子元素宽度撑开;使用了display:inline-flex属性后,父元素不设置宽度,宽度就是所有的子元素宽度之和,会被子元素宽度撑开,实现宽度自......
  • 2-SAT学习笔记
    2-SATk-SAT问题SAT是适定性(Satisfiability)问题的简称。一般形式为k−适定性问题,简称k−SAT。而当k>2时该问题为NP完全的。所以我们只研究k=2的情况。2−SAT,简单的说就是给出n个集合,每个集合有两个元素,已知若干个<a,b>,表示a与b矛盾(其中a与b属于不同的集合)。然后从每个集合选择......
  • 二十一、JS笔记
    JSONimportjson#对象转字符串str=json.dumps(dict,ensure_ascii=False)#ensure_ascii=True或不设置str=json.dumps(dict)#这时前端拿到的是未解码的数据:{"key1":"\u7528\u6237\u8f93...",...}obj=json.loads(str)#字符串转对象jsJSON.parse(str)#字符......
  • 拉格朗日插值学习笔记
    拉格朗日插值第一步:子函数\(f_i(x)=\begin{cases}1&x=x_i\\0&x=x_j(i\nej)\end{cases}\)由此可得:\(f(x)=\sum\limits_{i=1}^ny_if_i(x)\)第二步:对于\(f_i(x)\),要满足当\(x=x_i\)时,\(y=1\),而\(x\nex_i\)时,\(y=0\)故:\(f_i(x)=\dfrac{\prod\limits_{j=1,j\......
  • Ubuntu 设置合上笔记本盖子不休眠的方法
    Ubuntu设置合上笔记本盖子不休眠的方法编辑下列文件:sudogedit/etc/systemd/logind.conf​​#HandlePowerKey按下电源键后的行为,默认poweroff​​#HandleSleepKey按下挂起键后的行为,默认suspend​​#HandleHibernateKey按下休眠键后的行为,默认hibernate​​#HandleLidS......