数据结构
文章平均质量分 81
tanjunming2020
这个作者很懒,什么都没留下…
展开
-
李超线段树
## 介绍李超线段树,是用来解决平面直角坐标系中直线或线段的集合在某一点$x$处的最大值或最小值问题。在实现李超线段树的时候,打的标记是不用下传的,也就是标记永久化。在查询时,根节点到对应叶节点上的所有节点的贡献都要计算。线段树的区间对应的是平面直角坐标系的$x$轴上的区间,对于每个区间,要维护的是在这个区间上较优的直线或线段。原创 2023-09-19 19:58:48 · 139 阅读 · 0 评论 -
虚树学习小记
## 虚树是什么虚树指在原树上选择需要的点和它们的$LCA$组成的一棵树。这样可以使在树DP时顶点数更少,从而减少时间复杂度。一般用于有多组数据且能保证所有数据访问的点的和不超过规定范围。原创 2023-04-04 17:28:37 · 1373 阅读 · 1 评论 -
Splay
## 前言Splay是一种维护平衡二叉树的算法。虽然它常数大,而且比较难打,但Splay十分方便,而且LCT需要用到。原创 2023-02-14 16:41:14 · 1288 阅读 · 0 评论 -
二维树状数组
### 二维树状数组简介二维树状数组用于处理二维数组中的查询和修改。和一维树状数组一样,二维树状数组代码短,常数和空间小,时间复杂度小,十分方便好用。原创 2022-11-22 20:14:19 · 1780 阅读 · 0 评论 -
树状数组学习
### 树状数组简介树状数组,用于维护和查询前缀和,与线段树功能类似。树状数组代码短,常数和空间小,时间复杂度小,所以这也是一个十分优秀的算法。原创 2022-11-22 17:52:22 · 1097 阅读 · 0 评论 -
三维偏序cdq
了解了二维偏序的$cdq$分治,三维偏序其实就是再套一维。在用左区间更新有区间的时候,第一维和第二维都满足左边小于右边,但第三维不好判断。怎么办呢?用数状数组或线段树来维护第三维即可,其实就是二维偏序$cdq$加一点东西。原创 2022-09-28 17:27:09 · 1051 阅读 · 0 评论 -
cdq分治
### 介绍$cdq$分治是一种分治思想的算法,一般用来求二维偏序的问题,可以将$O(n^2)$的时间复杂度优化到$O(nlogn)$$cdq$分治的主要思想就是将要求的一段区间分为两个区间,先处理两个区间内的贡献,再处理两个区间相互的影响。因为左右区间相互独立,左区间在前,右区间在后,所以只有左区间影响右区间。只要在每次处理区间的时候处理左区间对右区间的影响,就能求出最后的答案。原创 2022-09-28 16:38:30 · 1086 阅读 · 0 评论 -
整体二分详解
整体二分是一种将所有修改和查询放在一起二分的离线算法。通过将所有操作二分,给每个查询查找一个正确的答案。举个例子,求区间第kkk小值。如果没有修改操作,那么用主席树就可以解决问题。但如果有修改操作的话,主席树就要套上一个数状数组,打起来十分麻烦。所以,对于这样的动态区间第kkk小查询,我们就要用到整体二分了。首先,我们将原数组的nnn个值看作nnn次插入操作,将修改操作看作一次删除操作和一次插入操作,那么所有操作都可以转化为插入、删除、查询操作。将这些操作按时间发生顺序放入队列中。原创 2022-09-21 19:54:21 · 2019 阅读 · 0 评论 -
斜率优化DP
形如f(i)=minai∗x(j)+bi∗y(j)的DP方程一般可以使用斜率优化。其中b单调递增,x(j),y(j)都是通过j能在常数时间内确定的值。原创 2022-09-21 17:30:47 · 998 阅读 · 0 评论 -
可持久化线段树(主席树)
可持久化线段树,又称主席树,是由不同版本的线段树组成的。这种线段树一般是权值线段树基于动态开点来实现的,可以返回到某个历史版本并在此基础上进行操作。可以用来求区间第k小问题。如果想保存不同历史版本的线段树,肯定要对每一次操作都开一个节点。但这样的话,空间明显会爆。我们继续分析,每次操作只会修改一个叶节点,那么有许多节点都是与之前的版本重复的。所以,在公共部分,当前版本的线段树可以共用之前的节点。这样,空间复杂度就降到了O(nlogn)原创 2022-09-20 15:32:30 · 883 阅读 · 0 评论 -
线段树合并
对于每次合并,我们从根节点往下依次遍历每个位置,如果某个位置两棵树都存在节点,则将一棵树上的信息加到另一棵树上,然后继续处理它们的左儿子和右儿子。因为权值线段树维护的是值域,而值域的范围可能很大,且值域中的许多位置是空的。此时,叶节点的数量就是元素的数量。一般的线段树维护的是区间上的信息,比如区间最大值,最小值,区间和等,维护的区间都对应数组的一段连续的下标。权值线段树是指以值域为区间的线段树,它维护的区间是一段值域,所以称之为权值线段树。线段树合并指将多棵线段树上的信息合并到一棵线段树上。原创 2022-09-16 15:40:44 · 1405 阅读 · 0 评论 -
线段树优化DP
在动态规划中,如果决策点是一段或若干段区间的最值,一般可以用线段树来快速求出决策点,将转移的时间复杂度从O(n)优化到O(logn)细节不必多讲,以下是例题,内附代码,以及题目来源的链接。原创 2022-09-06 19:49:05 · 950 阅读 · 0 评论 -
二进制优化背包
有一个背包,体积为m。现在给出n种物品,每种物品体积为ai,价值为bi,个数为ci。求这个背包能装下物品的最大价值为多少。如果把第i种物品拆成ci个物品来用01背包的方法做,则时间复杂度为O(m∑ci),在一些时候会TLE。所以我们需要用到二进制优化。对于题中的ci,我们可以把它分为(2t−1)+(ci−2t+1),其中t是满足ci−2t+1≥0的最大整数。2t−1。原创 2022-09-02 17:09:21 · 921 阅读 · 0 评论 -
1D/1D动态规划
1D/1D1D/1D1D/1D动态规划,就是指状态数为O(n)O(n)O(n),转移为O(n)O(n)O(n)的动态规划方程。一般的情况下求解的时间复杂度为O(n2)O(n^2)O(n2),但是,通过优化可以使时间复杂度降到O(nlogn)O(nlogn)O(nlogn)甚至O(n)O(n)O(n)。下面来讲一讲1D/1D1D/1D1D/1D动态规划中的决策单调性优化。.........原创 2022-08-31 20:24:08 · 1293 阅读 · 0 评论 -
分块算法详解
长为n的数列,操作涉及区间修改和区间查询,应该如何处理?用线段树等许多数据结构都可以做,但是有时用其它数据结构来解决会十分棘手,代码量也会变得很大。这时,我们就需要用到分块了。............原创 2022-08-26 12:13:37 · 1006 阅读 · 0 评论