算法竞赛基础
文章平均质量分 60
amazing550
这个作者很懒,什么都没留下…
展开
-
欧拉与快速幂
欧拉与快速幂目录欧拉与快速幂欧拉函数欧拉函数线性筛欧拉定理快速幂快速幂求逆元欧拉函数欧拉函数:求1~n之间有多少个数与n互质ϕ(n)=n(1−1p1)(1−1p2)......(1−1pk)\phi (n) = n(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})......(1-\frac{1}{p_{k}})ϕ(n)=n(1−p11)(1−p21)......(1−pk1)其中PkP_{k}Pk代表n的质因数 。ACwing873#include原创 2021-08-14 20:12:32 · 115 阅读 · 0 评论 -
因数质数模板合集
目录试除法判定质数分解质因数质数线性筛试除法求约数约数个数(含证明)约数之和试除法判定质数bool is_prime(int n ){ if(n < 2) return false ; for(int i = 2 ; i <= n/i ; i ++){ if(n%i == 0) return false ; } return true ;}分解质因数void div_prime(int n){ for(int i = 2 ; i原创 2021-08-14 19:42:46 · 93 阅读 · 0 评论 -
最小生成树专题
最小生成树目录最小生成树定义Prim大致思想代码模板定义连通图:在一个无向图中,任何两顶点都可以一若干条边连通生成树:在一个连通图中(定点数n),取n-1条边,这n-1条边可以把n个点串起来。最小生成树:假设每条边都有一个权值,则最小权值的生成树是最下生成树。Prim大致思想代码与Dijsktra极其相似。先找到从当前所在点到相邻点权值最小的点,将其划进生成树,然后更新将这个点的相邻点走过去所需的权值进行更新进行更新。代码模板#include <iostream>usin原创 2021-08-07 15:07:04 · 69 阅读 · 0 评论 -
最短路专题
最短路目录最短路序单源无负权最短路戴克斯特拉堆优化戴克斯特拉单源有负权最短路Bellman-FordSPFA多源汇最短路Floyd序在这篇文章中,n代表点的数量 ,m代表边的数量。单源无负权最短路戴克斯特拉适用于稠密图,且图中无负权的情况 。时间复杂度:O(n2)#include <iostream> #include <cstdio>#include <cstring>using namespace std ;const int N = 505原创 2021-08-01 15:49:50 · 104 阅读 · 0 评论 -
哈希散列表
哈希专题目录哈希专题哈希表定义整数哈希拉链法开放寻址法一次指针二次指针字符串哈希哈希表定义哈希表,又称为散列表,是一种根据键来直接访问内存位置的一种数据结构。它通过一个计算键值的函数(散列函数)来将所查询的数据映射到哈希表中的一个位置来查找该位置的内容,从而达到快速查找的目的。(存放记录的数组就称为哈希表)。**哈希函数:**每个元素原始值设为x,通过哈希函数h,我们可以得到一个映射值hash(x),记作 k = hash(x) 。**散列表:**以每个元素逗得哈希值的哈希值作为下标 ,对应到散原创 2021-07-27 20:03:33 · 65 阅读 · 0 评论 -
并查集 - 路径压缩 - 按秩合并
并查集目录并查集何为并查集并查集大致思想朴素并查集Build();Find(x);Union(x,y);何为并查集并查集是一种树形的数据结构,主要用于解决一些集合合并查询的问题。并查集森林是指将数据集合按树形的结构存储,即每一个节点都保存着对应的父节点,当父节点即本身是意味着到达根结点,根节点代表该集合。并查集大致思想每一个集合都设置一个代表元素。判断某个元素在某个集合就是找其代表元素,判断两个元素是否在同一个集合就是看其代表元素是否相同。每个元素都有一个指针,代表元素的指针指向自己,其他元素原创 2021-07-22 15:35:00 · 318 阅读 · 0 评论 -
自写Unique函数
C++ unique函数的意义此函数将vector中所有元素进行一个重新排列,将所有出现过的元素都按出现顺序排在前面且若有重复知排一个,剩下的重复元素放在vector最后,并且返回重复元素的首位置。例:01234原数组11223unique后数组12312返回坐标 3(返回类型是一个迭代器)自写uniquevector<int>:: iterator unique(vector<int>&a){ int原创 2021-07-15 14:18:00 · 386 阅读 · 0 评论 -
离散化(简单哈希)(数据压缩)
离散化目录离散化使用离散化的情况离散化的思想离散化的步骤例题ACwing802题目描述题目分析AC代码使用离散化的情况假设我们现在要对一些数据进行处理,而这些数据都有几个特征:数据数量不大:在一维数组可以开出来的大小之内。数据的值域很大:若以这个值域进行开辟数组会开不出来。满足这两个条件就可以使用离散化离散化的思想我们将这种数据进行映射,将我们要使用的不连续的值进行映射,映射到一片连续的地方。举例:现有5个数据分别为1,20,30000,50000000,1000000000。我们可原创 2021-07-14 21:01:54 · 575 阅读 · 0 评论 -
极大团问题
极大团问题目录极大团问题极大团的定义回溯法算法大概思路数据结构代码极大团的定义团:一个点集,其中任何顶点之间都有一条边。极大团:最大的团。独立集:一个点集,其中任何两点之间都没有边。最大独立集:最大的独立集。极大团=补图的最大独立集最大独立集=补图的极大团回溯法算法大概思路假设现在途中有n个点,每个点都有两种处理方式,选取或者不选取。这么算下来,就共有2n种情况。而这么多情况很明显可以抽象成一棵二叉树,一边是选取这个点,一边是不选取这个点。那么我们可以选用一种剪枝方案:在不选这原创 2021-07-02 21:29:34 · 441 阅读 · 0 评论 -
N皇后问题
N皇后目录N皇后问题描述问题分析题解代码数据结构的设计问题描述在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。问题分析我们按行来摆放棋子,每一行都会有N种摆放方法,这样分析下去,每一种情况共同构造出了一棵树.所以可以用dfs来解这个题.题解代码数据结构的设计首先棋盘的设计不是一个二维数组;;而是一个一维数组:: 下标代表是哪一行,存储的值代表这一行的原创 2021-07-02 16:13:04 · 54 阅读 · 0 评论 -
最接近点对问题--分支法
最近接点对目录最近接点对一维问题描述问题分析代码二维一维问题描述现有一个一维坐标,上面有若干个点,要找到其中距离最近的点。问题分析在按位置升序排列的区间内,选取一个分界点mid,选取左右距离最小的,再选取mid和mid+1的距离,然后这三个值进行比较。最小的就是这个区间内最小距离点对。在一个区间只有两个或三个点时:要进行特殊处理:两点:直接返回距离三点:返回这三点的最小代码#include <iostream>#include <algorithm>us原创 2021-07-01 15:55:08 · 222 阅读 · 0 评论 -
快速排序算法
快速排序目录快速排序算法思想算法模板AC代码注意事项算法思想首先,此算法利用的是分治的思想。所以我们在处理递归最底层的时候(也就是只有两个数字的排序时),所用到的逻辑会将这两个数字进行排序,所以在往上一层递归的时候,在分界点前后的序列都是满足某一个性质的。要满足的性质:设置一个x值和一个分界点,在其前面的的数字必须满足小于等于x,在其后面的必须满足大于等于x。算法的三个部分:设置一个x分界值:可以是左边界、又边界、中位数(序列中间)、随机数进行序列的调整,使其目前递归的的区间满足以上下性质原创 2021-06-29 22:20:44 · 78 阅读 · 0 评论 -
图形覆盖问题
图形覆盖问题目录图形覆盖问题问题描述解题思路代码实现问题描述在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。输入:三个整数,分别表示k,以及不可覆盖点的坐标输出:输出最终棋盘的样子,不可覆盖点为0,其他位置输出是第几块L块所覆盖的。解题思路首先我们选择利用分治法去解这个题。分支的规则是按照每个区域最中间的原创 2021-06-26 17:18:09 · 1186 阅读 · 0 评论 -
高精度专题
高精度目录高精度高精度数字的存储方法A+B的问题问题分析AC代码A-B问题问题分析AC代码A*a问题(一个大整数乘一个普通整数)问题分析AC代码A/a问题(一个大整数除一个普通整数)问题分析AC代码高精度乘高精度高精度的出现是为了解决计算机所不能存储的数据范围。当数字超出了这个范围,我们必须用一些算法来模拟人们计算的过程。高精度数字的存储方法通常采用数组存储数字的每一位。要注意的是尽量采用倒序存储,这是为了考虑进位问题:进位可以直接插到后面。A+B的问题问题分析高精度加法是一个最简单的高精度问原创 2021-06-26 14:47:19 · 165 阅读 · 0 评论 -
双指针算法
类型目录类型复杂度伪代码模板例题ACwing799题目大意:解法一:解法二(ACwing Y老师的方法)ACwing800:题目大意解题思路双指针算法主要可分两种:两数组双指针(代表:归并排序)单数组双指针(代表:快速排序)复杂度O(n): 确切说是2n。伪代码模板for(int i=1;i<=n;i++){ int j=i; while(j<=n&&[j]满足某周性质){ j++; } 接下来原创 2021-06-23 11:45:22 · 112 阅读 · 0 评论 -
M着色问题||算法设计与分析笔记
M着色问题||算法设计与分析笔记目录M着色问题||算法设计与分析笔记问题描述:问题分析:代码实现:代码所用到的数据结构:代码:问题描述:现有一无向连通图,相邻点不可着相同色,问其是否可以m着色,若可以输出方案与方案数。问题分析:可以将其构建成一个m叉子树,若不满足相邻点不同色,则剪枝。方案可行的条件:树的层数>点的个数。代码实现:代码所用到的数据结构:mm[][] 邻接矩阵记录无向图x[i] 记录i点的着色情况bestx[i] 记录可行的方案代码:#include <原创 2021-06-22 11:04:42 · 169 阅读 · 0 评论 -
前缀与差分
前缀:一维:原数组:a[i]前缀和数组:s[i]=a[1]+a[2]+...+a[i];作用:原创 2021-06-19 19:48:19 · 167 阅读 · 0 评论 -
整数二分模板
整数二分的本质不是单调性,有单调性可以用二分,无单调性也可以用二分。原创 2021-06-18 22:24:29 · 113 阅读 · 0 评论 -
ACwing 788 逆序对数量 分治法
题目大意:现有一个n长的无序数列,并且定义:若i<j,a[i]>a[j],则称无序对<a[i],a[j]>是逆序对。现求数列中原创 2021-06-16 14:58:20 · 78 阅读 · 0 评论 -
ACwing 796 二维前缀和
直接上图简单明了原创 2021-06-15 20:33:13 · 63 阅读 · 0 评论 -
acwing 787 归并排序模板
整体思想归并排序整体思想就是将一个长度为n的数组对半分,分成每个区间只有一个元素时进行每两个区间排序,然后合并。最后整个数组就是排序后的样子。原创 2021-06-15 19:48:49 · 106 阅读 · 0 评论 -
ACwing 789 二分查找区间
设要查找的区间左右分别为L,R。二分查找的左右边界为l,ryaocha第一次二分查找找的是L:如果[mid]<k原创 2021-06-15 10:33:28 · 110 阅读 · 0 评论 -
二分图专题
目录何为二分图染色法判断二分图输入格式输出格式数据范围输入样例输出样例题解分析代码匈牙利算法输入格式输出格式数据范围输入样例输出样例代码何为二分图设G=(V,E)是一个图,图的顶点集合可以分为两个集合V1,V2,E中的每个边都有一个点要么属于点集V1,另一个属于点集V2。这样的一个图被称作为二分图。染色法判断二分图给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数 n 和 m。接下来 m 行,每行包含两个整数 u 和 v,表原创 2021-09-03 13:10:33 · 174 阅读 · 0 评论 -
有向图的拓扑序列
有向图的拓扑序列这里写目录标题有向图的拓扑序列拓扑序列的定义入度与出度拓扑排序的大致思路ACwing848 有向图的拓扑排序输入格式输出格式数据范围输入样例:输出样例代码拓扑序列的定义给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。入度与出度多少条边指向自原创 2021-08-30 15:16:10 · 2995 阅读 · 0 评论 -
动态规划问题集合(updating)
目录DP问题的特征状态表示递推方程背包问题01背包DP问题的特征如果一个问题有在逐层向最优解进行一步一步地求解过程中,下一步有多种方案可以选择同时到达某一步可以从多个步骤求得,并且若是用广搜深搜技术难以实现或者时间复杂度超出所给限制时,我们可以考虑利用动态规划求解。状态表示首先动态规划需要用一个数组来表示某一状态,其中这一状态可分为集合和属性。集合代表到达当前状态的所有情况的集合。到达某一状态通常伴随着某种属性,这种属性可以是最大值、最小值和数量递推方程当前状态是由多个上一状态推导而来,则当原创 2021-08-21 20:47:54 · 151 阅读 · 0 评论 -
扩展欧几里得算法
扩展欧几里得算法目录扩展欧几里得算法数学推导同余方程(ACwing878)题目描述输入格式输出格式数据范围样例数学推导现有一二元一次方程:ax1+by1=max_{1}+by_{1}=max1+by1=max2+by2=gcd(a,b)ax_{2}+by_{2}=gcd(a,b)ax2+by2=gcd(a,b)由数学中的某一定理可知(裴蜀定理,直接用结论),当二元一次方程的结果mmm是两系数的最大公因数或是最大公因数的倍数,则我们可以得至少有一组整数解可以满足方程。且x1%x2原创 2021-08-20 17:59:37 · 46 阅读 · 0 评论 -
组合数学专题
组合数学专题目录组合数学专题公式1对于数据范围在1000左右2对于数据范围在10610^{6}106左右公式Cab=a!b!(a−b)!=a×(a−1)......×(a−b+1)b!C_{a}^{b} = \frac{a!}{b!(a-b)!}= \frac{a\times (a-1)......\times(a-b+1)}{b!}Cab=b!(a−b)!a!=b!a×(a−1)......×(a−b+1)1对于数据范围在1000左右已知公式:Cab=Ca−1b×Ca−1b−1C_原创 2021-08-18 19:00:28 · 95 阅读 · 0 评论