AcWing
代码欢乐豆
小白博主,将持续更新算法(大致逻辑上跟随AcWing)、计算机专业相关知识,大家点点关注不迷路~
展开
-
acwing第三章算法模板
/ 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。// dist[x]存储1号点到x的最短距离,cnt[x]存储1到x的最短路中经过的点数。原创 2024-10-19 14:58:03 · 462 阅读 · 0 评论 -
acwing第二章算法模板
/p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量。// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点。// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点。// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1。// 如果x在哈希表中,返回x的下标;//p[]存储每个点的祖宗节点, d[x]存储x到p[x]的距离。原创 2024-10-19 14:54:21 · 600 阅读 · 0 评论 -
acwing第一章算法模板
bool check(double x) {/* ... */} // 检查x是否满足某种性质。bool check(int x) {/* ... */} // 检查x是否满足某种性质。给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c。// C = A - B, 满足A >= B, A >= 0, B >= 0。// 映射到1, 2, ...n。原创 2024-10-18 22:52:25 · 720 阅读 · 0 评论 -
栈——直方图中最大的矩形(单调栈)
每个测试用例占据一行,用以描述一个直方图,并以整数 n 开始,表示组成直方图的矩形数目。对于每一个测试用例,输出一个整数,代表指定直方图中最大矩形的区域面积。现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。通常,直方图用于表示离散分布,例如,文本中字符的频率。当输入用例为 n=0 时,结束输入,且该用例不用考虑。直方图是由在公共基线处对齐的一系列矩形组成的多边形。这些数字以从左到右的顺序表示直方图的各个矩形的高度。矩形具有相等的宽度,但可以具有不同的高度。图例右图显示了所描绘直方图的最大对齐矩形。原创 2024-10-13 19:40:35 · 710 阅读 · 0 评论 -
栈——单调栈
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。第二行包含 N 个整数,表示整数数列。1≤ai≤10^9。第一行包含整数 N (1≤N≤10^5),表示数列长度。原创 2024-10-13 19:37:22 · 371 阅读 · 0 评论 -
双指针——最长不重复连续子序列
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。第二行包含 n 个整数(均在 0∼10^5 范围内),表示整数序列。共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。第一行包含整数 n。原创 2024-10-07 09:25:42 · 126 阅读 · 0 评论 -
双指针——删除有序数组中的重复项
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。第二行包括 n 个整数 ai (−10^4≤ai≤10^4)。第一行为一个整数 m,表示删除重复的数字后数组长度。第一行一个整数 n (0≤n≤10^7)。第二行为 m 个整数。原创 2024-10-07 09:26:14 · 221 阅读 · 0 评论 -
双指针——判断子序列
子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1, a3, a5} 是序列 {a1, a2, a3, a4, a5} 的一个子序列。给定一个长度为 n 的整数序列 a1, a2, …, an 以及一个长度为 m 的整数序列 b1, b2, ⋯, bm。第三行包含 m 个整数,表示 b1, b2, ⋯, bm (−10^9≤bi≤10^9)。第一行包含两个整数 n, m (1≤n≤m≤10^5)。如果 a 序列是 b 序列的子序列,输出一行 Yes。原创 2024-10-08 16:57:24 · 176 阅读 · 0 评论 -
栈——模拟栈
栈也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。像栈这种最后添加的数据最先被取出,即“后进先出”的结构,我们称为 Last In First Out,简称 LIFO。其中,empty 操作的查询结果为 YES 或 NO,top 操作的查询结果为一个整数,表示栈顶元素的值。接下来 MM 行,每行包含一个操作命令,操作命令为 push x,pop,empty,top 中的一种。从栈中取出数据时,是从最上面,也就是最新的数据开始取出的。栈的删除操作,叫做 出栈,也可称为 弹栈。原创 2024-10-06 15:09:05 · 1199 阅读 · 0 评论 -
位运算——n的二进制中有几个1
共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。第二行包含 n 个整数,表示整个数列。0≤数列中元素的值≤10^9。第一行包含整数 n。原创 2024-10-06 15:05:47 · 145 阅读 · 0 评论 -
链表——双向链表
例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…(4) IL k x,表示在第 k 个插入的数左侧插入一个数。(5) IR k x,表示在第 k 个插入的数右侧插入一个数。(1) L x,表示在链表的最左端插入数 x。(2) R x,表示在链表的最右端插入数 x。(3) D k,表示将第 k 个插入的数删除。(4) 在第 k 个插入的数左侧插入一个数;(5) 在第 k 个插入的数右侧插入一个数。(3) 将第 k 个插入的数删除;原创 2024-10-05 10:39:50 · 416 阅读 · 0 评论 -
链表——单链表
题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…,第 n 个插入的数。(3) I k x,表示在第 k 个输入的数后面插入一个数 x(此操作中 k 均大于 0)。(2) D k,表示删除第 k 个输入的数后面的数(当 k 为 0 时,表示删除头结点)。(1) H x,表示向链表头插入一个数 x。(2) 删除第 k 个插入的数后面的数;(3) 在第 k 个插入的数后插入一个数。原创 2024-10-05 10:37:48 · 334 阅读 · 0 评论 -
区间合并——模板题
给定 n 个区间 [li, ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。接下来 n 行,每行包含两个整数 l 和 r。第 i 行的两个数据表示 li, ri。例如:[1, 3] 和 [2, 6] 可以合并为一个区间 [1, 6]。共一行,包含一个整数,表示合并区间完成后的区间个数。输出合并完成后的区间个数。第一行包含整数 n。原创 2024-10-04 10:47:08 · 322 阅读 · 0 评论 -
离散化——区间和
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。共 m 行,每行输出一个询问中所求的区间内数字和。再接下来 m 行,每行包含两个整数 l 和 r。接下来 n 行,每行包含两个整数 x 和 c。第一行包含两个整数 n 和 m。原创 2024-10-04 10:43:39 · 588 阅读 · 0 评论 -
快速排序——第k个数
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。第二行包含 n 个整数(所有整数均在 1∼10^9 范围内),表示整数数列。输出一个整数,表示数列的第 k 小数。第一行包含两个整数 n 和 k。原创 2024-10-03 11:16:57 · 224 阅读 · 0 评论 -
快速排序——模板题
第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。输出共一行,包含 n 个整数,表示排好序的数列。输入共两行,第一行包含整数 n。给定你一个长度为n的整数数列。对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原创 2024-10-03 11:12:15 · 380 阅读 · 0 评论 -
归并排序——逆序对数量
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;给定一个长度为 n 的整数数列,请你计算数列中的。数列中的元素的取值范围 [1,1e9]。第二行包含 n 个整数,表示整个数列。第一行包含整数 n,表示数列的长度。输出一个整数,表示逆序对的个数。原创 2024-10-02 15:02:12 · 248 阅读 · 0 评论 -
归并排序——模板题
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。请你使用归并排序对这个数列按照从小到大进行排序。输出共一行,包含 n 个整数,表示排好序的数列。给定你一个长度为 n 的整数数列。输入共两行,第一行包含整数 n。并将排好序的数列按顺序输出。原创 2024-10-02 14:58:10 · 199 阅读 · 0 评论 -
高精度(4)——高精度除法
给定两个非负整数(不含前导 0)A ,B ,请你计算 A / B 的商和余数。共两行,第一行包含整数A ,第二行包含整数 B。共两行,第一行输出所求的商,第二行输出所求余数。参考高精度(1)(2)(3)部分注释。1≤A的长度≤100000,原创 2024-10-01 11:07:37 · 349 阅读 · 0 评论 -
高精度(3)——高精度乘法
给定两个非负整数(不含前导 0)A 和 B,请你计算 A × B的值。共两行,第一行包含整数 A ,第二行包含整数 B。共一行,包含A × B的值。1≤A的长度≤100000,原创 2024-10-01 11:03:09 · 271 阅读 · 0 评论 -
高精度(2)——高精度加法
给定两个正整数(不含前导 0),计算它们的和。共两行,每行包含一个整数。1≤整数长度≤100000。(建议参考博主博文部分注释。共一行,包含所求的和。原创 2024-09-30 15:27:26 · 290 阅读 · 0 评论 -
高精度(1)——高精度减法
给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。共两行,每行包含一个整数。1≤整数长度≤100000。共一行,包含所求的差。原创 2024-09-30 15:25:48 · 1351 阅读 · 0 评论 -
二分——二分查找
输入n个不超过109的单调不减的(就是后面的数字不小于前面的数字)非负整数a1,a2,…,an,然后进行m次询问。对于每次询问,给出一个整数q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出−1。数据保证,1≤n≤10^6,0≤ai,q≤10^9,1≤m≤10^5。第三行m个整数,表示询问这些数字的编号,从1开始编号。第一行2个整数n和m,表示数字个数和询问次数。本题输入输出量较大,请使用较快的 IO 方式。输出一行,m个整数,以空格隔开,表示答案。第二行n个整数,表示这些待查询的数字。原创 2024-09-29 20:21:52 · 337 阅读 · 0 评论 -
队列——模拟队列
像队列这种最先进去的数据最先被取来,即“先进先出”的结构,我们称为First In First Out,简称 FIFO。其中,empty 操作的查询结果为 YES 或 NO,query 操作的查询结果为一个整数,表示队头元素的值。接下来 M 行,每行包含一个操作命令,操作命令为 push x,pop,empty,query 中的一种。从队列中取出(删除)数据时,是从最下面,也就是最早入队的数据开始的。现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。下图就是队列的概念图。原创 2024-09-29 20:15:22 · 981 阅读 · 0 评论 -
队列——单调队列
有一个长为 n 的序列 a,以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。对于 100% 的数据,1≤k≤n≤10^6, ai∈[−2^31,2^31)。例如:[1, 3, −1, −3, 5, 3, 6, 7] k=3。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。第一行输出,从左至右,每个位置滑动窗口中的最小值。第二行输出,从左至右,每个位置滑动窗口中的最大值。输入一共有两行,第一行有两个正整数 n, k。原创 2024-09-28 20:52:52 · 309 阅读 · 0 评论 -
差分——二维差分矩阵
输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。接下来q行,每行包含5个整数x1, y1, x2, y2, c,表示一个操作。−1000≤矩阵内元素的值≤1000−1000≤矩阵内元素的值≤1000。共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。每个操作都要将选中的子矩阵中的每个元素的值加上c。接下来n行,每行包含m个整数,表示整数矩阵。原创 2024-09-28 20:47:31 · 314 阅读 · 0 评论 -
双指针——数组元素目标和
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。请你求出满足 A[i]+B[j]=x 的数对 (i,j)。第二行包含 n 个整数,表示数组 A。第三行包含 m 个整数,表示数组 B。共一行,包含两个整数 i 和 j。数组长度不超过 105。同一数组内元素各不相同。数组下标从 0 开始。1≤数组元素≤109。原创 2024-09-27 18:13:19 · 354 阅读 · 0 评论 -
AcWing——由数据范围反推算法复杂度以及算法内容
n≤1000000=> O(n), 以及常数较小的 O(nlogn)O(nlogn) 算法 => 单调队列、 hash、双指针扫描、BFS、并查集,kmp、AC自动机,常数比较小的 O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa。n≤1000 => O(n^2),O(n2logn),dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Ford。n≤10000000 => O(n),双指针扫描、kmp、AC自动机、线性筛素数。原创 2024-09-27 17:59:32 · 316 阅读 · 0 评论 -
差分——一维差分
接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。共一行,包含 n 个整数,表示最终序列。−1000≤整数序列中元素的值≤1000。第二行包含 n 个整数,表示整数序列。输入一个长度为 n 的整数序列。请你输出进行完所有操作后的序列。第一行包含两个整数 n 和 m。原创 2024-09-26 18:39:49 · 353 阅读 · 0 评论 -
并查集——连通块中点的数量
对于每个询问指令 Q1 a b,如果 a 和 b 在同一个连通块中,则输出 Yes,否则输出 No。接下来 m 行,每行包含一个操作指令,指令为 C a b,Q1 a b 或 Q2 a 中的一种。对于每个询问指令 Q2 a,输出一个整数表示点 aa 所在连通块中点的数量每个结果占一行。给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。第一行输入整数 n, m (1≤n,m≤10^5)。原创 2024-09-26 18:34:17 · 709 阅读 · 0 评论 -
并查集——合并集合
对于每个询问指令 Q a b,都要输出一个结果,如果 a 和 b 在同一集合内,则输出 Yes,否则输出 No。接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。第一行输入整数 n, m (1≤n, m≤105)。原创 2024-09-25 19:52:11 · 222 阅读 · 0 评论 -
Trie树——最大异或对
此题运用的模板是Trie字典树,可以先参考代码注释。原创 2024-09-23 15:12:50 · 320 阅读 · 0 评论 -
Trie树——字典Trie树
共有 N (1≤N≤2×10^4) 个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。对于每个询问指令 Q x,都要输出一个整数作为结果,表示 x 在集合中出现的次数。接下来 N 行,每行包含一个操作指令,指令为 I x 或 Q x 中的一种。第一行包含整数 N,表示操作数。原创 2024-09-23 14:58:19 · 239 阅读 · 0 评论 -
KMP——字符串匹配
本文是小白博主对KMP的详细解析,包括KMP字符串匹配过程、next数组求解过程及代码展现、超详细代码注释及纯享版代码,适合算法小白快速掌握KMP算法。原创 2024-09-19 16:32:24 · 2255 阅读 · 0 评论