![](https://img-blog.csdnimg.cn/direct/db3ca6b141d345f7ae5d46fa7d2d226b.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
OI算法与数据结构
文章平均质量分 95
OI中的常用算法&数据结构解析+例题+难题简要题解,也包含个人记录
UnderTheTime
洛谷号:https://www.luogu.com.cn/user/680855
CF号:https://codeforces.com/profile/under_the_time
展开
-
Day1 计数类dp 知识点 & 部分例题
相当于计数、数方案数的 dp,其中概率就是总方案数合法方案数。原创 2024-07-11 11:59:06 · 165 阅读 · 0 评论 -
2024信友队春季 Day3 二分&分治
也叫折半搜索,用于在一个数组中查找某一元素的算法。给定一个长度为n的从小到大排列的数列a和q次询问,每次询问给定x,查找x 在数列中的位置。nq≤106。对于ai,如果xai,因为a有序,则xain;同理如果xai,则xa1i。然后就可以二分了。令lr表示x可能的区间,每轮求出一个mid2lr,如果xamid则mid即为答案;如果xamid则区间被缩短为lmid−1;原创 2024-06-22 11:44:10 · 774 阅读 · 0 评论 -
P4097 【模板】李超线段树 / [HEOI2013] Segment 题解
这样我们就完成了对完全覆盖的区间的修改。对于其他部分覆盖的区间直接递归左右儿子解决即可。对于查询操作,将自己的答案与左右儿子取个。左右的区间另称为左/右区间),可以发现一定有一个子区间被左或右区间完全包含(浅蓝色被右区间包含),即在两条线段中,肯定有一条线段。我们考虑线段树上被两条线段完全覆盖的一个部分为。)先被加入,显然整个线段在当时就是最优的;因为每次修改操作都需要递归左右儿子,所以加线段的复杂度是。此时深红色的部分没有受到影响,只可能成为右区间最优的线段)。其中,红色线段(记为。原创 2024-05-26 09:48:57 · 595 阅读 · 0 评论 -
Day2 字符串哈希&KMP
将一个字符串转成一个数字,可以快速比较两个字符串是否相同等。要求为:相同字符串哈希值相同,不同字符串哈希值尽量不相同。映射方法通常采用多项式哈希方法,很像进制转换。假设字符串为 SSS,其哈希值为 f(S)f(S)f(S)。定义一个小的正整数 basebasebase(比如说 27,13127,13127,131),表示将 SSS 视为 basebasebase 进制下的数字。将字符串中涉及到的每个单独的字符 SiS_iSi,转换为一个数字 xix_ixi(比如说 a\texttt{a}a 为 000,原创 2024-04-10 21:35:22 · 1202 阅读 · 0 评论 -
Day1 单调数据结构
单调数据结构,顾名思义具有单调性,比如说递增/递减。单调栈和单调队列秉持着的原则。原创 2024-04-04 19:14:14 · 1085 阅读 · 0 评论 -
最小生成树 算法解析+例题
给出一张n个点m条边的无向连通图G,每条边uv有边权wuv。顾名思义,在G的所有生成树中找一棵边权之和最小的树,这棵边权和最小的树就被称为G的最小生成树 MST(记为T生成树即为在G上的m条边中选择n−1条边将所有点连通组成的树。原创 2024-03-24 13:50:37 · 909 阅读 · 1 评论 -
最短路 算法解析+例题
最短路可以认为是图论最基础的内容之一,涉及到的算法也很多。为了方便,假设图有 $n$ 个点,$m$ 条边,$(u,v)$ 这条边的边权用 $w(u,v)$ 表示。### 性质有几条关于**边权为正**的图的最短路的性质:- 任意两点之间的最短路,不会经过重复的点和边。- 任意两点之间的最短路,结点数不会超过 $n$,边数不会超过 $n-1$。对于前者,由于边权为正,如果一条最短路需要经过重复的点或边,更优的做法显然是在**第一次经过这个点或者边时**原创 2024-03-14 21:04:10 · 2090 阅读 · 1 评论 -
倍增法/st表 算法解析+例题
倍增,顾名思义就是成倍的增加。主要思想就是将问题的大区间分成 $\log n$ 个小块,每个块的长度为一个尽可能大的二的整数次幂,对于每个块用类似动态规划的方法 $O(n\log n)$ 预处理出来这部分的信息,最终用这些小块整合成大区间。能够把 $O(n)$ 的时间复杂度降到 $O(\log n)$。以一个经典的问题入手:> 给定一棵树,若干组询问求 $u,v$ 的最近公共祖先,即 `LCA`。倍增法求 `LCA` 的基本流程:- 预处理出第 $i$ 个点往上跳 $2^j$ 次能跳到原创 2024-03-11 18:41:26 · 1093 阅读 · 1 评论 -
并查集 算法解析+例题
本质是一个森林,相同集合的元素属于同一棵树中。初始时每个点都是一棵树,自己即为根节点。对于前者,在实现上判断两个节点所在树的根节点是否相同。,即在查询的过程中直接将自己的父亲设为根节点,可以缩短查询需要往上跳的距离。对于后者,将其中一个节点所在树的根节点的父亲设为另一个节点所在树的根节点的儿子。,也叫,即总是将节点数少的、深度小的树的根节点的父亲设为另一个根节点,也是缩短了查询时跳跃的距离。在同时使用路径压缩和启发式合并之后,每个操作的平均时间复杂度为Oαn)),其中αn。原创 2024-03-06 19:43:26 · 1957 阅读 · 1 评论 -
拓扑排序 算法解析+例题
拓扑排序,一般指在一个DAG(有向无环图)中将顶点排序,使得对于图上任意一条有向边uvu在拓扑排序后在v的前面。这个排序的结果称为拓扑序。显然拓扑序一般不唯一。因为拓扑序满足后面的点不会对前面的点产生依赖,所以经常和动态规划结合在一起使用,保证后面的点不会影响前面已经计算过贡献的点。一张图存在拓扑序,当且仅当这是张DAG,所以一个常见的套路就是:先对原图进行缩点,然后用拓扑+动态规划等统计答案。拓扑算法基本流程:记录图中每个点的入度d,将入度等于0的点入队。每次取出一个队首u,将每一个与。原创 2024-03-03 11:02:49 · 1168 阅读 · 0 评论 -
优先队列/二叉堆 算法解析+例题
优先队列:队列中的元素保持某种优先关系,比如大根堆中的元素就是谁大谁在前。朴素二叉堆:支持插入数,删除一个最值(堆顶),查询一个最值(堆顶)。二叉堆本质是一颗完全二叉树,父亲总是比儿子拥有更高的优先级(比如更大、更小等)。堆顶元素优先级最高。插入时把元素放在这棵树最底下(具体看代码),如果父亲比自己优先级低就交换,循环往复直至根节点。删除堆顶类似,把堆顶与堆底交换后删除堆顶,此时堆顶就是优先级较低的元素。从左右儿子中挑一个优先级更高的比较,如果自己的优先级更低则与之交换,循环往复直至叶节点。原创 2024-02-29 16:00:00 · 1160 阅读 · 0 评论