摘要:
单调队列优化\(DP\) 例题:滑动窗口 思路 在求\(\max\)时考虑到当一个数大于前面的数时,前面的数将无论如何也不会被使用了。当时间超过时,前面的数也应当不被记录。能支持从前和从后操作的数据结构:双端队列。因为队列中前面的数总是大于后面的数,所以被称为单调队列。 双端队列内存放下标\(i\) 阅读全文
posted @ 2024-10-09 18:36
Zzzzzzzm
阅读(15)
评论(0)
推荐(0)
摘要:
区间 \(dp\) 一般还是有很明显的提示,时间复杂度 \(O(n^3)\),因此一般 \(n\leq 500\)。实现一般也很套路,外层循环枚举区间长度 \(len\);中层枚举始端点 \(i\),并得出末端点 \(j=i+len-1\);内层枚举 \(k,i\leq k<j\);写状态转移方程。 阅读全文
posted @ 2024-10-09 18:35
Zzzzzzzm
阅读(5)
评论(0)
推荐(0)
摘要:
例题一:最长不下降子序列 思路 可以考虑到\(dp[i]=dp[j]+1,(j<i,a[j]<a[i])\),因此可以使用两层\(for\)循环求出答案。考虑到当前点的最优解一定是基于前一个恰好比当前点小的点的值,因此即可每次二分查找已有的序列,若序列末尾都小于了当前点,就更新当前点,反之,则替换第 阅读全文
posted @ 2024-10-09 18:34
Zzzzzzzm
阅读(7)
评论(0)
推荐(0)
摘要:
网络,是指一个有向带权图,并且有两个特别的点——源点与汇点。 对于流 \(f_{u,v}\),满足以下三个条件 容量限制:对于每条边,流量不超过其容量。 斜对称性:每条边与其反边流量之和为 \(0\),即 \(f_{u,v}=-f_{v,u}\)。 流守恒性:从源点流出量等于汇点流入量。 最大流 最 阅读全文
posted @ 2024-10-09 18:32
Zzzzzzzm
阅读(14)
评论(0)
推荐(0)
摘要:
\(Prim\) 思路 类似于\(dijkstra\),每次从当前已选过的点中连边选出最优的一个添加,并把该点加入集合。时间复杂度为\(O(n^2)\)。可以进行堆优化,但优化后时间复杂度仍与\(kruskal\)相当且代码复杂,适用于稠密图。 \(Code\) int Prim(){ mems 阅读全文
posted @ 2024-10-09 18:31
Zzzzzzzm
阅读(11)
评论(0)
推荐(0)
摘要:
\(dijkstra\) 朴素的\(dijkstra\) 时间复杂度\(O(n^2)\),每次枚举取出到已有状态最短的一个点加入进行更新。 堆优化的\(dijikstra\) 每次取出堆顶的元素进行更新,然后把被更新的元素加入堆中,堆按从小到大排序,可以保证时间复杂度在\(O(n\log n)\)。 阅读全文
posted @ 2024-10-09 18:31
Zzzzzzzm
阅读(8)
评论(0)
推荐(0)
摘要:
分块显然是众多数据结构中最通用,最容易被卡掉也是出题人最希望卡掉的作法。在一众神犇的奇思妙想下,大部分的 \(DS\) 都被各种分块卡过了,甚至一些较为复杂的树套树等等都是分块可能可以卡的作法。 分块的精髓在于块的大小,块大小为 \(\sqrt{n}\) 是最为常见的,因为它此时平衡了操作与查询之间 阅读全文
posted @ 2024-10-09 18:29
Zzzzzzzm
阅读(10)
评论(0)
推荐(0)
摘要:
思路 对于最短路树上的任意非根节点 \(u\),\(dist(root,u)=\) \(root\) 到 \(u\) 的最短路。最短路树上的边一般是正权值的,因为如果是负权值好像建树的复杂度就高达 \(O(n^3)\) 了,因为 \(dijkstra\) 无法保证正确性,而 \(floy 阅读全文
posted @ 2024-10-09 18:28
Zzzzzzzm
阅读(11)
评论(0)
推荐(0)
摘要:
性质 \(Link\) \(Cut\) \(Tree\) 是基于 \(Splay\) 与实链剖分实现的。 \(LCT\) 可以实现诸多操作: 查询、修改链上的信息 更换原树的根 动态连边、删边 动态维护连通性 \(LCT\) 在中序遍历的情况下总是深度严格单调递增的。每个节点仅包含于一个 \(Spl 阅读全文
posted @ 2024-10-09 18:27
Zzzzzzzm
阅读(12)
评论(0)
推荐(0)
摘要:
\(Splay\) \(Splay\),一种平衡树,较大儿子的期望比例大概为 \(0.6\) 左右,优于 \(FHQ\_Treap\) 的 \(0.7\),也就是说一般情况下跑的是比较快的,时间复杂度在平衡树中算比较优秀。 \(Splay\) 的核心思想是旋转维持树的平衡,每次操作后就将操作节点调整 阅读全文
posted @ 2024-10-09 18:25
Zzzzzzzm
阅读(10)
评论(0)
推荐(0)
摘要:
思路 合并数组的时间复杂度是\(n\times v\),所以肯定在某些时候是无法通过的。这个时候我们可以考虑有些点是根本没有用到过的,所以用权值线段树来更新的好处在于它可以免去一些未出现的节点或者只有一方出现过的节点。 例题:[Vani有约会]雨天的尾巴 思路 首先输入一个树进行树上的两点之间的加减 阅读全文
posted @ 2024-10-09 18:23
Zzzzzzzm
阅读(15)
评论(0)
推荐(0)
摘要:
主席树 思路 主席树是可持久化线段树,换而言之就是可以记录历史版本。 首先想到每进行一次操作就重新新建一棵树,然而这样空间复杂度是巨大的,且有很多并未改变的点重新建立就被浪费了。因此考虑每次只重建被改变的点,对于单点修改而言也就是修改了叶节点到根节点上一条链的信息,空间复杂度就极大减小了。 构建一个 阅读全文
posted @ 2024-10-09 18:22
Zzzzzzzm
阅读(14)
评论(0)
推荐(0)
摘要:
思路 将数组用\(lowbit(x)\)划分,可以支持单点修改与区间查询,时间复杂度为\(O(n\log n)\),常数小于线段树,不过可操作的内容较少,使用也较少。树状数组经过一些奇特的改造以后可以支持区间修改与单点查询,时间复杂度仍为\(O(n\log n)\),但是只支持区间加减 阅读全文
posted @ 2024-10-09 18:20
Zzzzzzzm
阅读(13)
评论(0)
推荐(0)
摘要:
思路 \(ST\) 表可以在 \(O(n\log n)\) 的预处理以后 \(O(1)\) 的解决 \(RMQ\) 问题,并且不能带修。 \(RMQ\) 问题有这样一个特质:重复计算并不会影响最终结果,例如计算一个点最大值的两次并不会改变最终的区间最大值,因此 \(ST\) 表的作法也由此而生。首先 阅读全文
posted @ 2024-10-09 18:16
Zzzzzzzm
阅读(4)
评论(0)
推荐(0)