Gene_INNOCENT
Wait for the sunrise!
展开
-
详解单调栈算法
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。栈属于基础数据结构之一,基础到仅用「后进先出」这四个字即可完整概括其核心特征。然而,基础并不代表着简单,「后进先出」的背后反而隐藏着多样的变化与极其广泛的应用。在本篇文章中,我们将针对在基础栈上稍加改动所形成的「单调栈」算法进行详解。该算法与「单调队列」组成了算法题中最常考察的线性数据结构,属于面试中必知必会的算法知识。栈首先我们来回忆一下「栈」。「栈」是一种「后进先出」的线原创 2021-03-17 00:19:45 · 7157 阅读 · 9 评论 -
详解单调队列算法
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。在上一篇文章中,我们介绍了「单调栈」这一最常考察的线性数据结构。而今天我们将继续沿着这个思路,介绍另一个与其 “齐名” 的线性数据结构,即「单调队列」。「单调队列」在「数据结构」题中的分布较为广泛,且常被当作优化「动态规划」的一种重要手段,因此该算法在面试中考察的频率较高,属于必知必会的知识点。队列首先我们来回忆一下「队列」。「队列」是一种「先进先出」的线性数据结构,其中元素原创 2021-03-17 00:25:43 · 6956 阅读 · 10 评论 -
算法萌新如何学好动态规划(一)
前言本文是我在「力扣」上写的第二篇文章,现将其发布于此处。动态规划问题一直是大厂面试时最频繁出现的算法题,主要原因在于此类问题灵活度高,思维难度大,没有很明显的套路做法。也正是因为这个原因,我们打算出一个「动态规划」系列文章来尝试破解面试中所涉及的动态规划问题。而本文就是这个系列的第一篇文章,主要目的是说明动态规划是什么,动态规划问题应该如何思考?本文一共分成三个部分,具体内容框架如下所示:宝石挑选问题引入小 Q 是一个宝石爱好者。这一天,小 Q 来到了宝石古董店,店家觉得小 Q 是个宝石原创 2020-08-06 09:09:13 · 1721 阅读 · 0 评论 -
算法萌新如何学好动态规划(二)
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。本文是「动态规划」系列文章的第二篇,主要聚焦于常见线性 DP 模型的讲解。线性 DP 是所有 DP 模型中最为常见与基础的模型,也是面试中最频繁考察的动态规划模型,因此我们将其放在本系列的第二篇进行介绍。本文一共分成四个部分,具体内容框架如下所示:动态规划解题思路回顾在正式开始线性 DP 的介绍前,我们需要回忆一下「动态规划(一)」中的主要内容,即动态规划的解题思路。动原创 2020-12-05 23:44:53 · 376 阅读 · 0 评论 -
算法萌新如何学好动态规划(三)
前言本文是「动态规划」系列文章的第三篇,作为「动态规划(二)- 线性 DP」的一个延伸,将主要聚焦于动态规划经典模型 —— 背包问题的讲解。背包问题属于线性 DP 模型,之所以单独拎出来讲,主要是因为该问题信息量大且十分重要,属于面试中常考且必会的知识,因此我们将其放在本系列的第三篇进行介绍。本文一共分为三个部分,具体内容框架如下所示:前文回顾解题思路回顾回顾一下第一篇文章,动态规划解题过程一共分为两步,一是确定「DP 状态」,二是确定「DP 转移方程」。「DP 状态」的确定有两大原则,一原创 2020-12-05 23:46:53 · 330 阅读 · 0 评论 -
二分算法系统梳理
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。力扣题库目前一共 1971 道题,而其中高达 110 道题均与「二分」有关,其普遍性与重要性不言自明。然而尽管它这么重要,但大多数同学依然没能很好地掌握,总是会在各种细节上跌跟头,因此我们需要对该算法进行系统地梳理。「二分」一共有三类常见应用,分别是「整数二分」、「实数二分」以及「二分答案」,接下来将分别介绍这三类应用的具体形式。整数二分整数二分即为在整数集合上的二分,常见的原创 2021-03-17 00:27:44 · 270 阅读 · 1 评论 -
详解树状数组
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。树状数组,经典树形数据结构之一,代码很短,但其蕴含的算法思想却非常精妙。可以这么说,刷算法题却不懂树状数组,那绝对算是一大遗憾。树状数组,常用于高效处理「一个数组的更新以及前缀和的求取」。具体来说,其常用于高效求解如下问题:给定一个长度为 n 的数组 nums,需要支持两类操作:操作 1: 将 nums[i] 的数值增加 v操作 2: 求取 nums[1] + nums[2原创 2021-06-01 20:02:53 · 380 阅读 · 1 评论 -
组合计数基础
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。在算法竞赛中,数学主要分为「数论」与「组合计数」两大部分。相比「数论」,「组合计数」通常是作为一种计数思想与其他题型(例如「动态规划」)相结合,进行统一考察。在上一篇文章中,我们已针对「数论」进行了讲解,因此本文将介绍「组合计数」。排列组合加法原理若完成一个任务的方法有 nnn 类,其中第 iii 类方法有 xix_ixi 种不同的做法,则完成这个任务共有 x1+x2+.原创 2021-03-17 00:15:56 · 285 阅读 · 0 评论 -
矩阵快速幂详解
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。设想这样一个场景,面试官给了你一道算法题,你很快确定这是一道递推问题,并给出了 O(n) 的解题方法,然而面试官却继续问:“还能继续优化吗?”这样类似的场景并不少见,因为算法不仅追求「正确」,还追求「效率」,而这也正是优化方法的意义。本文即将介绍的「矩阵快速幂」便是一种常见的优化递推的方法,能将 O(n) 的递推过程加速至 O(log(n)),使效率显著提升。矩阵运算首先我原创 2021-06-01 19:59:51 · 1147 阅读 · 0 评论 -
划分数算法概述及习题
划分数概述划分数习题1. Drama 题意: 给出一个 H\text{H}H 行 N\text{N}N 列的网格,(r,c)(r,c)(r,c) 指第 rrr 行第 ccc 列的格子。现在需要在网格中选择 N\text{N}N 个格子涂成黑色。这 N\text{N}N 个格子需要满足一定的条件。(1,1)(1,1)(1,1) 需要涂黑。如果 (r,a)(r,a)(r,a) 与 (r,...原创 2019-08-21 12:56:52 · 469 阅读 · 0 评论 -
刷算法题必备的基础数论知识
前言如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。在力扣刷题时,「数学」是大家绕不过去的内容。事实上,力扣题库中标签为「数学」的题共有 208 道,仅次于 243 道的「动态规划」。然而对比「动态规划」,力扣题库中「数学」所涉及到的知识则要少很多,因此本篇文章将针对题库中「数学」所涉及的基础必备知识进行讲解,希望对大家日后刷题有所帮助。基础运算在「基础运算」部分,我们将主要介绍「位运算」与「快速幂」两个知识点。这两种运算方法原创 2020-12-05 23:50:01 · 836 阅读 · 0 评论 -
高斯整数、高斯素数、费马平方和定理
高斯整数a=x+y∗i (x,y∈Z)a = x+y*i\ \ (x,y\in Z)a=x+y∗i (x,y∈Z),则 aaa 为高斯整数。aaa 的范为 N(a)=∣a2∣=x2+y2N(a)=|a^2|=x^2+y^2N(a)=∣a2∣=x2+y2。若存在高斯整数 yyy,使得 ay=1ay=1ay=1,则 aaa 为高斯整数中的乘法可逆元,...原创 2019-07-18 16:07:46 · 4874 阅读 · 0 评论 -
有什么相见恨晚的算法答题套路?【力扣】
前言本文是我在「力扣」上写的第一篇文章,现将其发布于此处。众所周知,算法题主要有两大难点,一是「实现」,即算法本身的难度;二是「思路」,即你能否想到使用这个算法来解决题目。并且对于有一定刷题基础的同学来说,力扣上大部分简单、中等题所涉及的算法都是非常常见的算法,即算法本身不存在难度,最大的难点在于「思路」,即如何想到适合本题的算法。而解决「思路」问题,除了大量刷题积累经验之外,还可以采用一定的「巧劲」,从时间复杂度这个角度入手筛选出合适的算法。而本文的主要目的就是向大家介绍这种「巧劲」是如何在具体解原创 2020-08-06 09:04:35 · 1770 阅读 · 1 评论 -
整体二分算法完整总结
整体二分系列习题1. K-th Number题意: 无修改的区间第 kkk 大数问题。(1≤n≤105,1≤m≤5000)(1\leq n\leq 10^5,1\leq m\leq 5000)(1≤n≤105,1≤m≤5000)思路: 主席树模板题,但此处我们要用整体二分的方法来解决此题。首先我们将所有赋值操作和查询操作都放到一个数组中,形成了此题的操作序列。然后就是代码中的核心关键点 s...原创 2019-10-28 16:59:36 · 1777 阅读 · 0 评论 -
树上启发式合并算法概述及习题
树上启发式合并概述一、适用问题树上启发式合并作为树上问题三剑客之一(点分治、长链剖分),以其优雅的暴力而闻名于江湖之中。通常来说,如果一个问题可以被划分为一个个子树进行求解的问题,而且各个子儿子对答案的贡献容易添加与删除,就可以考虑使用树上启发式合并来求解。本文主要介绍树上启发式合并的一些习题,可以从习题中仔细感受该算法的一系列特点。二、算法介绍树上启发式合并需要两次 dfsdfsd...原创 2019-10-28 09:15:50 · 1766 阅读 · 0 评论 -
网络流习题集合
网络流习题1. 餐巾计划问题题意: 一共 nnn 天,餐厅每天需要 rir_iri 块餐巾。餐厅每天可以花 ppp 购买一块新餐巾;或者花 fff 将脏餐巾送到快洗部,mmm 天后洗好;或者花 sss 将脏餐巾送到慢洗部,nnn 天后洗好,求最小总花费。(1≤n≤2000,ri≤107,p、f、s≤104)(1\leq n\leq 2000,r_i\leq 10^7,p、f、s\leq 10...原创 2019-10-30 18:34:52 · 1830 阅读 · 1 评论 -
数位DP算法概述及习题
数位DP系列习题1. Daniel and Spring Cleaning题意: 给出区间 [l,r][l,r][l,r],查询多少对 (a,b)(a,b)(a,b) 满足如下条件。(0≤l≤r≤109)(0\leq l\leq r\leq 10^9)(0≤l≤r≤109)a+b=a xor ba+b=a \ xor \ ba+b=a xor bl...原创 2019-11-02 11:13:17 · 1610 阅读 · 0 评论 -
李超树算法完整总结
李超树概述一、用途维护一段区间的多条直线,维护区间 [L,R][L,R][L,R] 中的三条直线。支持单点查询多条直线最大/小值。如查询 midmidmid 处的多条直线的纵坐标最大值。支持区间查询直线最大/小值。如查询区间 [L,R][L,R][L,R] 中各直线最值的最大值。二、具体解析李超树在线段树每个节点中维护了一条直线。直线用斜截式表示,y=kx+by=kx+by=k...原创 2019-08-02 11:58:16 · 3354 阅读 · 0 评论 -
动态树算法概述及习题
一、动态树习题1. [国家集训队] Tree II题意: nnn 个点一棵树,支持四种操作。(1≤n,q≤105,0≤c≤104)(1\leq n,q\leq 10^5,0\leq c\leq 10^4)(1≤n,q≤105,0≤c≤104)+ u v c+\ u \ v \ c+ u v c,将 uuu 到 vvv 的路径上的...原创 2019-09-18 10:37:48 · 1429 阅读 · 0 评论 -
线性基算法完整总结
线性基概述一、定义设数集TTT为一组数任意子集异或得到的集合。TTT的线性基是TTT的一个子集 A=A=A= { a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an}。AAA中元素互相xorxorxor所形成的异或集合,等价于原数集TTT的元素互相xorxorxor形成的异或集合。可以理解为将原数集进行了压缩。二、性质线性基...原创 2019-07-22 15:45:29 · 1672 阅读 · 0 评论 -
长链剖分算法完整总结
长链剖分概述一、适用问题涉及深度的树形 DP\text{DP}DP,长链剖分可以将其复杂度从 O(n2)O(n^2)O(n2) 优化到 O(n)O(n)O(n),基本思想是采用了指针偏移直接从重 (长) 儿子处继承了大量信息。长链剖分优化树形 DP\text{DP}DP 可以解决的问题与点分治以及树上启发式合并具有一定的重复性。通常解决的题目只有一次询问,如果有多次询问,需要离线操作。二...原创 2019-08-17 16:52:57 · 1682 阅读 · 2 评论 -
后缀数组算法概述及习题
后缀数组概述一、适用问题后缀数组的题目非常灵活多变,主要涉及字符串所有后缀的字典序比较以及最长公共前缀。本文主要介绍后缀数组的一些经典应用,虽然是经典应用,但是其思想应该属于后缀数组类问题的本质思想。二、算法介绍求解后缀数组的算法主要有倍增法、DC3DC3DC3 算法,具体的算法实现此处就略过了,想要具体了解的话可以自行 googlegooglegoogle 搜索。下文给出的后缀数组模...原创 2019-10-24 21:12:21 · 382 阅读 · 0 评论 -
卡特兰数详解
卡特兰数一、基础公式定义式f[n]=∑i=0n−1f[i]∗f[n−1−i]f[n]=\sum\limits_{i=0}^{n-1}f[i]*f[n-1-i]f[n]=i=0∑n−1f[i]∗f[n−1−i]组合数公式 (用生成函数推导定义式)f[n]=C2nn−C2nn−1f[n]=C_{2n}^n-C_{2n}^{n-1}f[n]=C2nn−C2nn−1f[n]...原创 2019-09-08 21:32:02 · 461 阅读 · 0 评论 -
斯坦纳树算法概述及习题
斯坦纳树概述一、适用问题一个图中,有若干个关键点,将这几个关键点连在一起的最小花费。直观的理解,就是带关键节点的最小生成树。当然不同的题会有不同的限制,比如关键节点必须是叶子节点,或者求一个斯坦纳森林(需要对斯坦纳树再进行一次状压)。二、DP思想在图上找一个树,应该如何定状态呢?还记得第一次遇到斯坦纳树问题时,状态定的五花八门,眼花缭乱的,怼了一整场也只是空耗时间。其实,斯坦纳树的状...原创 2019-08-13 21:28:53 · 2449 阅读 · 0 评论 -
AC自动机算法概述及习题
AC自动机习题1. Censored! 题意: 用 nnn 个基本字符组成一个长度为 mmm 的字符串,要求字符串中不能出现给定的 ppp 个非法串中任何一个,输出方案总数。(1≤n,m≤50,0≤p≤10)(1\leq n,m\leq 50,0\leq p\leq 10)(1≤n,m≤50,0≤p≤10)思路: 数据范围比较小,因此不难往 dpdpdp 上进行思考。又因为有多个非法串,考虑...原创 2019-09-25 21:33:11 · 1499 阅读 · 0 评论 -
回文自动机算法+马拉车算法概述及习题【回文串系列问题】
Manacher 概述一、适用问题ManacherManacherManacher 算法主要解决的是给出一个字符串,O(n)O(n)O(n) 复杂度下求出以字符串中任意一个节点为中心所能扩展的最大距离。二、算法解析扩充字符串为了统一奇偶字符串,算法首先在每两个字符(包括头尾)之间加没出现的字符(如*),这样所有字符串长度就都是奇数了,简化了问题。abcde⟶∗a∗b∗c∗d∗e∗...原创 2019-10-06 23:49:17 · 1716 阅读 · 0 评论 -
莫队算法完整总结(普通莫队、带修莫队、树上莫队、回滚莫队)
普通莫队带修改莫队树上带修改莫队回滚莫队原创 2019-09-05 20:58:58 · 2700 阅读 · 3 评论 -
全图中第K小路径/团问题(有向/无向)
问题概述:最近频繁遇见图上的第 kkk 小问题,比如无向图的第 kkk 小团、有向图上的第 kkk 小路径,无向图上的第 kkk 小最短路问题。然后这类方法的解决方法都比较相近,主要思考方向是先将边或单点加入堆中,然后每次弹出一个最小值,再用最小值去更新到一个新的状态,并将新状态加入到堆中,一直到计算到 kkk 次为止。主要思想就是这样,但是具体操作上,对于不同的问题,涉及到不同的处理方式,...原创 2019-08-24 15:46:27 · 2165 阅读 · 0 评论 -
DP 转移方程 —— 单调队列优化 & 斜率优化 & 李超树优化
前言最近比赛遇到了一道李超树优化 DPDPDP 方程的题,比赛时推出了方程,但由于对斜率优化方程格式的不熟悉,误以为是斜率优化的问题,导致最终错失 ACACAC,因此想要将这三种格式的方程列举在一起,便于后续查阅。单调队列优化首先我们需要回忆单调队列的作用,O(n)O(n)O(n) 求出每一个大小为 KKK 的窗口中的最大、最小值,因此我们可以得到如下 DPDPDP 转移方程:f[i]=max(v[j])+base[i],i−j≤Kf[i] = max(v[j])+base[i],i-j\leq原创 2020-07-23 10:33:27 · 1441 阅读 · 0 评论 -
拉格朗日乘子法总结(等式约束、不等式约束、非线性规划、KKT 条件)
前言本文主要对拉格朗日乘子法进行总结,具体原理可以参考这两篇文章:友情链接 1友情链接 2如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。拉格朗日乘子法基本的拉格朗日乘子法主要是针对等式约束下的非线性方程最优化问题,具体形式如下:{max f(x)s.t. g(x)=0\left\{\begin{aligned}\max & \ \ f(\textbf{x}原创 2020-08-31 00:27:50 · 9407 阅读 · 2 评论 -
力扣题目算法分类【持续更新】
动态规划线性 DP198. 打家劫舍 - 简单300. 最长递增子序列 (LIS) - 中等1143. 最长公共子序列 (LCS) - 中等120. 三角形最小路径和 - 中等354. 俄罗斯套娃信封问题 - 困难72. 编辑距离 - 困难背包问题416. 分割等和子集 - 中等494. 目标和 - 中等322. 零钱兑换 - 中等518. 零钱兑换 II - 中等474. 一和零 - 中等区间 DP1039. 多边形三角剖分的最低得分 - 中等516. 最长回文子原创 2021-01-15 20:14:35 · 1359 阅读 · 0 评论 -
掌握用 STL 中的 SET 动态维护 “各类型凸壳” / “凸包”
一、例题引入题意:主人公小智一共会捕捉 nnn 只宝可梦,宝可梦有两个属性,攻击值 AAA,防御值 BBB。每当捕捉到一只新的宝可梦 TTT,小智有两种方法判断这只宝可梦是否是无用的。存在一只宝可梦 XXX,使得 X.A>T.AX.A > T.AX.A>T.A 并且 X.B>T.BX.B > T.BX.B>T.B存在两只宝可梦 X,YX,YX,Y,使得...原创 2020-02-23 22:47:02 · 1618 阅读 · 1 评论 -
【带权并查集详解】以HDU 3038为例【How Many Answers Are Wrong】
带权并查集详解:首先讨论一下带权并查集的主要功能。并查集主要是维护不同元素之间传递关系的数据结构,如果不带权,那么维护的就是不同元素是否属于同一个集合,即连通关系。如果带权,那么除了维护连通性之外,还会维护同一个集合中各个元素之间的关系。对于带权并查集的具体实现,最重要的维护元素是 d[x]d[x]d[x],表示元素 xxx 到根节点 rootrootroot 的偏移量,即 d[x]=x→ro...原创 2019-03-18 12:40:10 · 459 阅读 · 5 评论 -
【Nowcoder - 5670 B Graph】2020 牛客暑期多校训练营(第五场)【最小异或生成树、Boruvka 思想】
题意给定一颗 nnn 个点的树,每条边的权重为 wiw_iwi。(2≤n≤105,0≤wi<230)(2\leq n\leq 10^5,0\leq w_i< 2^{30})(2≤n≤105,0≤wi<230)可以任意删除一些边或者增加一些边,但是在删增过程中必须保证图连通并且任意一个环的异或和为 000。在此基础上,求最小生成树。题目链接:linklinklink思路观察题目要求,删增过程中保证图连通且任意一个环的异或和为 000,所以其实 (u,v)(u,v)(u,v)原创 2020-08-07 10:42:42 · 325 阅读 · 0 评论 -
【博弈 —— SG函数详解+例题解析】
SG函数解析:博弈游戏的本质是一个有向图游戏,每个状态(局面)是一个图中一个节点,每个节点可以通向其他多个状态,而每个节点又由nnn个子游戏组成。如下图所示,y1y_1y1、y2y_2y2、y3y_3y3…都是一个状态,这些状态是不能同时到达的。而G1G_1G1、G2G_2G2、G3G_3G3…属于y4y_4y4状态(局面)中的mmm个子游戏,这mmm个子游戏是同时存在的,但是这...原创 2019-04-09 19:55:42 · 2518 阅读 · 2 评论 -
【带权并查集题目汇总】
食物链(POJ 1182):题意: 有 NNN 个动物,编号为 1−N1-N1−N,每个动物都是是A,B,CA,B,CA,B,C 中的一种,但是我们并不知道它们是哪一种。现在给出 KKK 句话,“1 X Y”“1 \ X \ Y”“1 X Y” 表示 XXX 和 YYY 是同类,“2 X Y”“2 \ X \ Y”“2 X&n...原创 2019-03-22 11:19:10 · 1612 阅读 · 0 评论 -
【洛谷 P3384】树链剖分【详解树链剖分】
题意:一颗 NNN 个节点的树,每个节点上都有初始权值。现在有四种操作:操作 111 —— 1 x y z1\ x\ y\ z1 x y z,表示将 xxx 到 yyy 节点最短路径上所有节点的值加z操作 222 —— 2 x y2\ x\ y2 x y,表示求 xxx 到 yyy 节点最短路...原创 2019-03-15 15:48:56 · 2429 阅读 · 0 评论