
AcWing-算法基础
文章平均质量分 62
AcWing-算法基础
在人间负债^
商务合作/毕设指导加微:vx18706579002。阿里、腾讯云等多个社区专家博主、创作之星,华为云开发者社区认证博主,华为云-云享专家,鸿蒙开发者。 会点前后端开发、大数据开发、数据分析、测试、爬虫,喜欢分享,热爱写文章,享受解决BUG的快感。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数学知识 ---- 约数
给定 n 个正整数 ai,对于每个整数 ai,请你按照从小到大的顺序输出它的所有约数。原创 2022-09-21 10:53:09 · 230 阅读 · 0 评论 -
数学知识 ---- 质数
在大于 1 的整数中,只包含 1 和自己本身两个约数的数,被称为质数(素数)原创 2022-09-20 11:02:38 · 245 阅读 · 0 评论 -
搜索与图论 ---- 染色法判定二分图
二分图就是图中的集合(u,v)中都只包含点,而不包含边。二分图中不包含奇数环何为奇数环:奇数环就是环中边的数量是奇数同样的,如果一个图是二分图,那么该图中就一定不会包含奇数环。同样的,如果一个图中含有奇数环,那么该图就一定不会是二分图。原创 2022-09-19 10:15:28 · 422 阅读 · 0 评论 -
搜索与图论 ---- 匈牙利算法
二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。接下来 m 行,每行包含两个整数 u 和 v,表示左半部点集中的点 u 和右半部点集中的点 v 之间存在一条边。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。输出一个整数,表示二分图的最大匹配数。给定一个二分图,其中左半部包含 n。),二分图共包含 m 条边。请你求出二分图的最大匹配数。第一行包含三个整数 n。原创 2022-09-18 09:21:08 · 252 阅读 · 0 评论 -
贪心算法模板题
区间选点题目链接给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。输入格式第一行包含整数 N,表示区间数。接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示所需的点的最小数量。数据范围1≤N≤105−109≤ai≤bi≤109输入样例:3-1 12 43 5输出样例:2解题思路:先将所有的区间进行右端点排序原创 2021-12-17 09:48:18 · 205 阅读 · 0 评论 -
搜索与图论 ---- 拓扑排序
拓扑序列拓扑序列是有向无环图按拓扑排序生产的序列,(有向无环图一定有拓扑序,反之一定没有拓扑序),对于有向无环图,一定存在一个入度为 0 的点,该点是拓扑序的第一个点,将该点拿出,并将于该点相连的点的入度全部减一,再次找出剩余点中入度为 0 点,直到图中所有的点都添加到拓扑序列中,反之若有剩余的点尚未加入到拓扑序列中,则说明该图不是有向无环图。// 求解拓扑序时采用模拟队列比较好,因为队列中的数就是相对应拓扑序bool topsort(){ int hh=0,tt=-1; for(int i原创 2021-08-02 20:52:54 · 469 阅读 · 0 评论 -
差分约束系统
差分约束1.最短路的性质若图中不存在负权回路,则运行完最短路算法后,对于边( x , y )来说,一定有 dist [ y ] <= dist [ x ] + w ;即 dist [ y ] - dist [ x ] <= x;因为最短路的核心就是:dist [ y ] = min ( dist [ y ] , dist [ x ] + w ) ;2.差分约束系统3.差分约束系统与最短路差分约束系统和最短路都满足三角不等式,因此可以根据给出的三角不等式,将差分约束系统转化为一张图,原创 2021-08-02 19:45:39 · 136 阅读 · 0 评论 -
C语言位运算符:与、或、异或、取反、左移和右移
C语言位运算符主要包括六种:与( & )、或( | )、异或( ^ )、取反( ~ )、左移( >> )和右移( << )运算符含义描述&按位与如果两个相应的二进制位都为1,则该位的结果值为1,否则为0I按位或两个相应的二进制位中只要有一个为1,该位的结果值为1^按位异或若参加运算的两个二进制位值相同则为0,否则为1~取反~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0<<左原创 2021-08-01 18:18:23 · 23420 阅读 · 2 评论 -
搜索与图论 ---- Prim和Kruskal求最小生成树
稠密图用邻接矩阵存储稀疏图用邻接表存储首先将邻接矩阵初始化为无穷大,将点和点之间的距离读入将 dist[] 数组初始化为无穷大每次选点,将该点加入到集合中,n 次迭代,找出未在集合中的点到集合的最短距离,更新距离,将该点加入到集合中。原创 2021-07-26 22:11:44 · 161 阅读 · 0 评论 -
搜索与图论 ---- Floyd求最短路 及 输出路径
题目链接给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定 k 个询问,每个询问包含两个整数 x 和 y,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impossible。数据保证图中不存在负权回路。输入格式第一行包含三个整数 n,m,k。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。接下来 k 行,每行包含两个整数 x,y,表示询问点 x 到点 y 的最短距离。输出格式共 k 行,原创 2021-06-06 20:19:14 · 322 阅读 · 0 评论 -
搜索与图论 ---- spfa 判断负环
题目链接给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你判断图中是否存在负权回路。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式如果图中存在负权回路,则输出 Yes,否则输出 No。数据范围1≤n≤2000,1≤m≤10000,图中涉及边长绝对值均不超过 10000。输入样例:3 31 2 -12 3 43 1 -4输出样例:Yes原创 2021-06-06 19:43:17 · 224 阅读 · 0 评论 -
搜索与图论 ---- spfa 求最短路 及 输出路径
题目链接给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible。数据保证不存在负权回路。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 impossible。数据范围1≤n,m≤105,原创 2021-06-06 18:11:24 · 383 阅读 · 0 评论 -
搜索与图论 ---- Bellmen-ford 算法求最短路 及 路径输出
题目链接给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。注意:图中可能 存在负权回路 。输入格式第一行包含三个整数 n,m,k。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。如果不存在满足条件的路径原创 2021-06-02 21:33:08 · 304 阅读 · 1 评论 -
搜索与图论 ---- Dijkstra 求最短路 及 输出递归路径
朴素Dijkstra原创 2021-06-02 15:34:33 · 667 阅读 · 0 评论 -
搜索与图论 ---- 最短路解法
搜索与图论 ---- 最短路解法原创 2021-06-01 21:30:56 · 124 阅读 · 0 评论 -
搜索与图论 ---- 树与图的深度优先遍历
树与图的深度优先遍历树的重心给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示将重心删除后,剩余各个连通块中点数的最大值。数据范围1≤n≤105输入样例原创 2021-03-14 11:41:26 · 208 阅读 · 0 评论 -
搜索与图论 ---- 树与图的广度优先遍历
树与图的深度优先遍历树的重心给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数n,表示树的结点数。接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。输出格式输出一个整数m,表示将重心删除后,剩余各个连通块中点数的最大值。数据范围1≤n≤105输入样例原创 2021-03-14 11:35:24 · 288 阅读 · 0 评论 -
搜索与图论 ---- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS)类似一棵树,搜索时按支搜索,直到这一支搜索完成,完成后回溯到叶节点的父节点,看父节点是否还有子节点若有,则继续进行搜索,若没有则继续回溯例 1.排列数字给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1代码样原创 2021-03-10 21:30:20 · 321 阅读 · 1 评论 -
数据结构 ---- 哈希表
字符串哈希str = " a , b , c , d , e … " ;先将字符串 str 预处理成s [ 1 ] = " a " ;s [ 2 ] = " a , b " ;s [ 3 ] = " a , b , c " ;……将预处理后的字符串转换为 p 进制数,根据经验所谈当 p = 131 或 p = 13331 时,出现重合的概率为 0.001% for(int i=1;i<=n;i++) { p[i]=p[i-1]*P; h[i]=h[i-1]*P+str原创 2021-03-07 15:52:45 · 226 阅读 · 0 评论 -
数据结构 ---- 模拟散列表
模拟离散表将一些比较大的数映射到一个小范围内,和离散化有些相似当多个数经过映射后,映射到同一个数时的解决办法拉链法开发寻址法AcWing 840. 模拟散列表维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果原创 2021-03-06 16:37:20 · 235 阅读 · 0 评论 -
数据结构 ---- 模拟堆
模拟堆堆的基本结构一棵完全二叉树最后一层可以不满,从左到右一次排布父节点小于两个子节点根节点是最小值堆的存储一维数组存储堆1号节点是根节点左儿子是 2x右儿子是 2x+1基本操作down 上移void down(int u){ int t = u; if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2; if (u * 2 + 1 <= size && h[u *原创 2021-03-02 21:28:04 · 237 阅读 · 0 评论 -
数据结构 ---- 并查集
并查集用处合并两个集合查看两个元素是否是在一个集合之中基本原理每个集合用一棵树来表示,树根的编号是整个集合的编号。每个节点存储 x 的父节点,p [ x ] 表示 x 的父节点。问题如何判断树根 if ( p [ x ] == x )求 x 的集合编号 while ( p [ x ] != x) x = p [ x ]如何将两个集合合并 p [ x ] 是 x 的集合编号,p [ y ] 是 y 的集合编号 ;p [ x ] = y ;模板(1)朴素并查集: int原创 2021-02-28 17:27:55 · 163 阅读 · 0 评论 -
数据结构 ---- Trie 树
Trie 树基本用法Trie字符串统计高效的存储和查找字符串集合的数据结构维护一个字符串集合,支持两种操作:“I x”向集合中插入一个字符串x;“Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。输出格式对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。每个结果占一行。数原创 2021-02-23 10:16:57 · 153 阅读 · 0 评论 -
数据结构 ---- KMP
KMP一、KMP是什么?二、KMP的高效性三、模板四、例题KMP字符串匹配输入格式输出格式数据范围输入样例:输出样例:代码样例一、KMP是什么?KMP全称为Knuth Morris Pratt算法,三个单词分别是三个作者的名字。KMP是一种高效的字符串匹配算法,用来在主字符串中查找模式字符串的位置(比如在“hello,world”主串中查找“world”模式串的位置)。二、KMP的高效性该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了原创 2021-02-20 11:40:53 · 584 阅读 · 0 评论 -
数据结构 ---- 单链表和双链表
单链表一个位置有两个属性,一个是存储的元素,一个是该位置的节点,节点指向下一个元素的位置邻接表 :存储图存储树模板// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[id原创 2021-02-18 19:54:23 · 358 阅读 · 0 评论 -
基础算法 ---- 区间合并
区间合并快速的将有交集的区间合并成一个区间步骤 :按区间左端点排序扫描整个区间,将可能有交集的区间合并三种情况两个区间包含关系两个区间有交集两个区间无交集例题1.区间合并给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的原创 2021-02-02 20:07:12 · 563 阅读 · 0 评论 -
基础算法 ---- 离散化
离散化值域 0 ~ 10910^{9}109个数 0 ~ 10510^{5}105a [ ] : 1 , 3 , 100 , 2000 , 500000 ;下标 : 0 , 1 , 2 , 3 , 4 ;将数组中的值映射到下标的过程就叫作离散化问题:a [ ] 中可能存在重复元素 去重去重代码模板在这里插入代码片如何算出 x 离散化后的对应下标是多少 二分二分代码模板在这里插入代码片例题题目假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行原创 2021-02-02 19:15:14 · 189 阅读 · 0 评论 -
基础算法 ---- 位运算以及进制之间的转换
二进制求 n 的第 k 位数 :n >> k & 1 ;返回 n 的最后一位 1 :lowbit ( n ) = n & - n ;求 n 的第 k 位数二进制数的个位的下标是 0 ,以此向上把第 k 位右移到最后一位 :n >> k ;看个位是几 x & 1 ;代码样例十进制 n = 10 ;二进制 n = 1010 ;#include<iostream>using namespace std;int main原创 2021-02-01 11:17:29 · 302 阅读 · 0 评论 -
基础算法 ---- 双指针算法
双指针双指针算法应用范围十分广:快速排序(单个序列)、归并排序(两个序列)…// 朴素算法 o(n²)for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ // 具体算法 }}// 双指针算法 o(n)for(int i=0,j=0;i<n;i++){ while(i<n&&check(i,j)) i++; // 具体算法}......原创 2021-02-01 10:20:37 · 215 阅读 · 0 评论 -
基础算法 ---- 前缀和与差分
前缀和一、如何求前缀和 一维 :原数组 : A1 , A2 , A3 … An前缀和: S0 = 0 , S1 = A1 , S2 = A1 + A2 … Sn = A1 + A2 + … +An求解公式:[ l , r ] = Sr - S(l-1)为什么是 ( l - 1 ) , 要保留 l 点的数为什么S0 = 0 , 方便处理边界问题二维 :同理可以推出二维的公式,若感觉抽象的可以画一下图,这里我就不画了,毕竟画图水平不是很高前缀和 :S i j = S (i-1) j +S原创 2021-01-26 13:14:58 · 274 阅读 · 0 评论 -
基础算法 ---- 高精度
高精度大整数相加:位数 ≤10610^{6}106大整数相减:位数≤ 10610^{6}106大整数乘常数:位数≤ 10610^{6}106大整数除常数:位数≤ 10610^{6}106大整数存储大整数 int 存不下,一般存入一个数组中由个位开始存储,方便进位代码模拟计算逢十进一...原创 2021-01-26 09:36:42 · 273 阅读 · 2 评论 -
基础算法 ---- 二分
整数二分二分的思想就是在一个单调的序列中找出符合条件的数据,每次查找区间缩小一半...原创 2021-01-23 10:32:27 · 192 阅读 · 0 评论 -
基础算法 ---- 快速排序和归并排序
快速排序 分治思想确定分界点X:初值,末值,中间值,随机一个值调整区间:将小于等于X的数全部在X的左边,大于等于X的数全部在X的右边递归处理:分别递归左边区间和右边区间 模板代码如下 :调整区间 用两个指针分别从初值和末值开始往中间走,当碰到左边碰到大于等于X的值左指针停下,当右边碰到小于等于X的值右指针停下,将左右数值交换,重复上述操作,当左指针移动到右指针右侧后结束递归。void quick_sort(int a[],int l,int r){ if(l>=r) retu原创 2021-01-22 12:38:38 · 377 阅读 · 0 评论