![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法竞赛知识点整理
文章平均质量分 71
退役之后决定对之前某大号上乱七八糟的Blog进行一个整理归纳...顺便准备准备推免机试..
Nismilesucc
New beginning.
展开
-
进阶动态规划
5.数位统计dp例题:计数问题输入1 1044 497346 5421199 17481496 14031004 5031714 1901317 8541976 4941001 19600 0输出1 2 1 1 1 1 1 1 1 185 185 185 185 190 96 96 96 95 9340 40 40 93 136 82 40 40 40 40115 666 215 215 214 205 205 154 105 10616 113 19 20 114原创 2021-09-24 13:32:34 · 117 阅读 · 0 评论 -
动态规划
title: 动态规划date: 2019-07-01 11:18:40tags: dp动态规划DP主要分为状态表示(这个dp数组表示的是哪一个集合以及属性值是什么(eg:max,min,数量等))和状态计算两部分。dp数组是满足(以背包问题为例)以下两个条件:1.只从前i个物品中选 2.总体积<=j 所有选法的集合,而dp[i][j]的值是集合里所有选法的价值的最大值。...原创 2020-08-29 22:03:18 · 201 阅读 · 0 评论 -
Nim博弈和SG函数
1.Nim博弈原创 2020-08-21 20:08:58 · 401 阅读 · 0 评论 -
组合数相关问题
1.容斥原理注意根据数据范围选择求组合数的方式(1) <2000如果硬算话,时间复杂度O(nm),105 * 2000=2 * 108会超时,不同的a,b可以构成的的对数为2000 * 2000=4 * 106,所以我们可以先求出所有CabC_a^bCab的值2.容斥原理例题 能被整除的数输入10 22 3输出7代码如果暴力去做,枚举n个数以及枚举m个质数,时间复杂度为O(nm)的,n就已经109了,所以不行,一定要用容斥原理做。对于每个质数,建立一个1~n内的倍原创 2020-08-20 16:59:14 · 452 阅读 · 0 评论 -
高斯消元
1.高斯消元在O(n^3)下求解一个包含n个方程组n个未知数的多元线性方程组n元线性方程组解的三种情况:无穷多组解、唯一解、无解例题1 解线性方程组输入31.00 2.00 -1.00 -6.002.00 1.00 -3.00 -9.00-1.00 -1.00 2.00 7.00输出1.00-2.003.00代码例题2 解异或线性方程组输入31 1 0 10 1 1 01 0 0 1输出100代码...原创 2020-08-20 16:58:59 · 2427 阅读 · 0 评论 -
欧拉函数相关问题代码实现
1.欧拉函数φ(n):1~n内,与n互质的数的个数φ(6)=2,1 2 3 4 5 6任意正整数n: n=p1a1p2a2...pmamn=p^{a_1}_1p^{a_2}_2...p^{a_m}_mn=p1a1p2a2...pmam ( pip_ipi 为素数)欧拉函数计算公式:φ(n)=n(1−1p1)(1−1p2)...(1−1pm)φ(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_m})φ(n)=n(1−p1原创 2020-08-16 00:58:39 · 345 阅读 · 1 评论 -
扩展欧几里得和中国剩余定理
1.欧几里得算法 O(logn)int gcd(int a,int b){ if(!b) { return b; } return gcd(b,a%b);}2.贝祖定理正整数a,b,那么一定存在非零整数x,y使得ax+by=gcd(a,b) 构造法证明——扩展欧几里得算法贝祖定理扩展:如果 ax+by=n有解,充要条件是 n 是gcd(a,b)的倍数a是最大公约数的倍数,b是最大公约数的倍数,他们乘以一个系数相加,也应该是gcd(a,b)的倍数3.扩展欧几里得算法ax+by原创 2020-08-16 00:58:25 · 424 阅读 · 0 评论 -
概率相关概念
title: 概率date: 2019-08-09 14:10:06tags: 概率论一、概率论概率空间:由三元组(Ω,F,P)定义:Ω是所有可能输出(样本点)的非空集合,称作样本空间.F是样本空间Ω幂集的非 空子 集, F⊆2ΩF\subseteq 2^{\varOmega}F⊆2Ω,称作事件空间.P称为概率 ,是一个从F到实数域R的函数.每个事件都被此函数赋予一个0和1之间的概率值.eg.抛六面的色子,所有可能输出 (样本空间)Ω={1,2,3,4,5,6}. .原创 2020-08-15 13:19:05 · 1480 阅读 · 0 评论 -
欧拉函数相关概念
一、欧拉函数给定正整数n,欧拉函数φ(n)=不大于n且和n互质的正整数的个数(包括1)。φ(1)=1φ(n)=Σi=1n[gcd(i,n)==1]\varphi \left( n \right) =\varSigma_{i=1}^{n}\left[ gcd\left( i,n \right) ==1 \right]φ(n)=Σi=1n[gcd(i,n)==1]完全余数集合: Zn={ 不大于n 且和n 互质的数} |Zn| =φ(n)性质(1)p为素数 ,则 φ( p)=p -1质数与小原创 2020-08-15 12:51:13 · 1401 阅读 · 1 评论 -
约数相关问题
1.试除法求约数一个数的约数一定是成对出现的,所以只要判断较小的约数,枚举到 d<√n即可void get_divisors(int n){ vector<int> v; for(int i=1;i<=n/i;i++) { if(n%i==0) { v.push_back(i); if(i!=n/i)//把更大的那个约数加进来 v.push_back(n/i); } } sort(v.begin(),v.end()); for(int原创 2020-08-09 17:01:14 · 351 阅读 · 0 评论 -
质数相关问题
1.素数判定 (试除法)(1)最简单的暴力版本 O(n)bool is_prime(int n){ if(n<2) return false; for(int i=2;i<n;i++) if(n%i==0) return false; return true;}(2)由“因子都是成对出现的”进行到√n的优化 O(√n)d≤ndd≤\frac{n}{d}d≤dn,d≤nd≤\sqrt{n}d≤n判断条件不推荐写成i*i≤n,在n接近于int最大值时,i2可能&l原创 2020-08-07 01:42:14 · 336 阅读 · 0 评论 -
二分图判定和匈牙利算法
一、染色法判定二分图二、匈牙利算法原创 2020-08-05 16:20:51 · 315 阅读 · 0 评论 -
最小生成树问题
1.朴素版Prim基本思路初始化 dis[i] <- 正无穷大for (i=0;i<n;i++) t <- 找到集合外距离最近的点 用 t 更新 其他点 -> 集合 的距离 //Dij是来更新到起点的距离 st[t]=true;//把t加到集合里 2.Kruskal基本思路1.将所有边按权重从小到大排序//O(mlogm) 算法的瓶颈2.枚举每条边 a,b,权重c //O(m) if a,b不连通 //并查集判环 将这条边加到集合中...原创 2020-08-05 11:30:19 · 713 阅读 · 0 评论 -
最短路相关算法
最短路问题难点在于建图,如何把原问题抽象成最短路问题,如何定义点和边1.朴素版Dijkstra算法原创 2020-08-04 15:19:17 · 449 阅读 · 0 评论 -
搜索和拓扑排序
一、深度优先搜索 DFS二、广度优先搜索 BFS三、树与图的深度优先遍历四、树与图的广度优先遍历五、拓扑排序原创 2020-07-26 01:09:45 · 229 阅读 · 0 评论 -
背包问题汇总
一、01背包对于每个物品只有选和不选两种状态枚举重量 从大到小题目链接#include <iostream>#include <algorithm>#include <cmath>#include <cstring>using namespace std;const int maxn=1e4+5;int v[maxn],w[max...原创 2020-07-24 17:31:03 · 302 阅读 · 0 评论 -
二叉树重构
二叉树重构前序遍历:根结点-左子树-右子树(D-L-R)中序遍历:左子树-根结点-右子树(L-D-R)后序遍历:左子树-右子树-根结点(L-R-D)由此可知:(1) 前序遍历(第一个为root)和后序遍历(最后一个为root)可以确定root(2) 中序遍历可以在知道根节点之后,确定左右子树所以 前序+中序 或 后序+中序 可以重构二叉树如果要用 前序+后序 重构,则要求二叉树为 ...原创 2020-05-13 17:34:48 · 203 阅读 · 0 评论 -
算法竞赛中可以注意的小细节
注:以上内容从我的思否账号搬迁而来原创 2020-05-13 17:23:19 · 208 阅读 · 0 评论 -
A*算法理解
广度优先(BFS)和深度优先(DFS)搜索在谈A*之前,还是要先聊聊搜索算法中的老祖宗,深度和广度优先搜索算法。这两个算法,基本上各教科书都会有讲解,各种面试基本上也都会面到。不过为了讲清楚A*,我们还是先一起来看看他们吧。 深度优先搜索,用俗话说就是不见棺材不回头。算法会朝一个方向进发,直到遇到边界或者障碍物,才回溯。一般在实现的时候,我们采用递归的方式来进行,也可以采用模拟压栈的方式来实现。 如下图,S代表起点,E代表终点。我们如果按照右、下、左、上这样的扩展顺序的话,算.转载 2020-05-11 17:16:46 · 1643 阅读 · 0 评论 -
hq的模板1
title: 模板整理date: 2019-03-21 19:00:36tags: 模板1.高斯消元// a[N][N]是增广矩阵int gauss(){ int c,r; for(c=0,r=0;c<n;c++) { int t=r; for (int i=r;i<n;i++) // 找到绝对值最大的行 ...原创 2020-04-29 00:39:30 · 323 阅读 · 0 评论 -
二次剩余
title: 二次剩余date: 2019-08-27 00:10:46tags: 数论一、定义(Quadratic_residue)一个整数X对另一个整数p的二次剩余 d注意这边的取模是 X2X^2X2 和 d 都要对p取模噢 eg. 32≡2(mod 7)3^2≡2 (mod\ 7)32≡2(mod 7),我们称 2是7的二次剩余当存在某个 X2≡d ...原创 2020-04-29 00:18:52 · 3067 阅读 · 0 评论 -
几道期望习题(概率dp)
title: 期望习题(概率dp)date: 2019-08-13 10:57:10tags: 概率几道例题1.Collecting Bugs POJ-2096(期望DP)题意:有n种bug,s个系统会出现bug,bug数量可以是无穷多的,有一个人一天能够找一个bug,bug出现在各个系统是等概率的,系统中发现的bug也是等概率的属于每种类别,问找到每种bug至少找到一个,每个系统至少找...原创 2020-04-29 00:11:43 · 517 阅读 · 0 评论 -
数论题集模板
title: 数论题集date: 2019-09-27 00:11:36tags: 数论1.阶乘分解eg: 5!=23∗3∗55!=2^3 * 3 * 55!=23∗3∗5输入:5输出:2 3 3 1 5 1#include <iostream>#include <map>#include <algorithm...原创 2020-04-28 23:52:52 · 296 阅读 · 0 评论 -
关于 __int128
关于 __int128众所周知:int是32位,范围大概为10^9long long(g++编译器), __int64(用%I64d控制,用scanf,printf比较好),都是64位扩展,范围大概是10^19关于两种扩展的区别,参照:https://blog.csdn.net/qq_31736627/article/details/52912691__int128是128位,大概10^...原创 2020-04-28 22:51:40 · 2905 阅读 · 0 评论 -
C++的STL库用法
C++的STL库用法原创 2020-02-25 23:48:57 · 257 阅读 · 0 评论 -
并查集、堆、Hash表
一、并查集二、堆三、Hash表原创 2020-02-22 20:16:53 · 278 阅读 · 0 评论 -
KMP和Trie
一、字符串匹配算法 KMP首先,我们看暴力怎么去做字符串匹配:每次一旦 t 和 s 不匹配,t 串后移1位又重头开始匹配工作 是 O(n2)O(n^2)O(n2) 的char s[maxn],t[maxn];for(int i=1;i<=n;i++) { bool flag=true; for(int j=1;j<=m;j++) { if(s[i]!=...原创 2020-02-19 14:58:20 · 255 阅读 · 0 评论 -
关于时间和空间限制的一些注意点
关于时间限制一般计算机1s能运行5∗1085*10^85∗108次左右,如果下表是以1s运行10710^7107来看的话:复杂度数量级(输入规模)最大规模O(N)10610^610610710^7107O(logN)>>102010^{20}1020很大O(NlogN)10510^51054.5∗1064.5*10^64.5∗106...原创 2020-02-19 00:21:11 · 1030 阅读 · 0 评论 -
平衡二叉树
平衡二叉树平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法)性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等其高度一般都良好地维持在O(log(n)),大大降低了操作的时间复杂度对于一般的二叉搜...原创 2020-02-19 00:19:21 · 123 阅读 · 0 评论 -
树
树形结构一、树形结构基本术语:结点: 数据元素 + 若干指向子树的分支结点的度:分支的个数树的度:树中所有结点的度的最大值结点的层次:假设根结点的层次为1,第k层的结点的子树根结点(也就是它的下一层)的层次为k+1树的深度:树中叶结点所在的最大层次有序树和无序树的区别:子树之间是否存在次序关系,即左右子树交换后还是不是同一棵树**森林:**是m(m≥...原创 2020-02-19 00:17:41 · 197 阅读 · 0 评论 -
同余和GCD
一、模运算a除以m的余数 r,r=a mod m=a%m0≤r≤m-1,一定存在 a=km+r,k=⌊a/m⌋a%m的正负由被除数a决定,与m无关,eg. 7%4=3,-7%4=-3二、同余同余(1) 给定一 个正整数 m和两个整数 a和b,如果 ((a-b)mod m)=0 ,则称 a和b模m同余,记为a≡b(mod m)(2) ((a-b)mod m)=0 当且...原创 2020-02-19 00:03:52 · 1082 阅读 · 1 评论 -
素数、约数、反素数
一、素数0和1既不是素数也不是合数,最小的素数是2(一)素数的判定:试除法:如果自然数n不能被[2,√n] 内的所有素数整除,那么n是素数。bool isPrime(int num) { if(num<=3) return num>1; //排除掉非 6x-1和6x+1的数 if(num%6!=1&&num%6!=5) return fal...原创 2020-02-18 23:47:30 · 461 阅读 · 0 评论 -
链表、单调队列
一、链表与邻接表链表建链表的方式1.指针方式struct node{ int val; node* next;};这种方式每次都要去new node();,速度很慢2.数组方式 也称 静态链表(1)用数组模拟单链表,用的最多的是 邻接表邻接表最主要的应用就是用来存储 树和图val[],next[]通过下标关联起来,最后一个结点的next值为 -1例题:#inclu...原创 2020-02-18 02:24:52 · 197 阅读 · 0 评论 -
离散化和区间合并
七、离散化和区间合并整数且保序的离散化值域范围很大 比如从 1−1091 - 10^91−109但是数量很少 比如只有 10510^5105个我们并不能开一个 10910^9109的数组里做些什么,所以我们采用映射的方式映射到 从0开始的连续的自然数上vector<int> alls; // 存储所有待离散化的值sort(alls.begin(),alls.end())...原创 2020-02-14 16:54:40 · 238 阅读 · 0 评论 -
位运算
六、位运算主要操作n的二进制表示中的第k位数字 n>>k&1返回n的最后一位1 lowbit(n)=n&-n 返回的是一个二进制数,最高位是1n=1010 lowbit(n)=10n=101000 lowbit(n)=1000那么 为什么n&-n就可以得到最后一位1呢?因为 -x=~x+1lowbit(x)的应用:求一个数二进制中的1...原创 2020-02-13 17:52:40 · 303 阅读 · 0 评论 -
双指针算法
五、双指针算法主要是两大类:模板:for(i=0,j=0;i<n;i++){ while(j<i&&check(i,j)) j++; //每道题目的具体逻辑}核心思想:将一个 O(n2)O(n^2)O(n2) 的算法 优化成 O(n)O(n)O(n)的for(int i=0;i<n;i++) for(int j=0;j<n;j++)...原创 2020-02-13 17:09:35 · 137 阅读 · 0 评论 -
前缀和与差分
四、前缀和与差分前缀和对于 a1,a2,a3,...,ana_1,a_2,a_3,...,a_na1,a2,a3,...,an 前缀和 Si=a1+a2+..+aiS_i=a_1+a_2+..+a_iSi=a1+a2+..+ai求 SiS_iSi : 递推求 Si=Si−1+a[i]S_i=S_{i-1}+a[i]Si=Si−1+a[i]作用:能快速的求出前面一段数...原创 2020-02-12 23:47:12 · 180 阅读 · 0 评论 -
高精度算法(c++版)
三、高精度高精度加法每次记得加 进位t 就行#include <iostream>#include <cstring>#include <vector>const int maxn=1e7+5;using namespace std;vector<int> aa,bb;//c=a+bvector<int> add(v...原创 2020-02-11 22:43:51 · 177 阅读 · 0 评论 -
二分算法
二、二分有单调性一定可以二分,但是可以二分的题 不一定就具有单调性 只需要能够分成两半 一半满足,另一半不满足整数二分边界问题是关键啊看mid属于左边还是右边,即 更新是l=mid 还是r=mid 从而选取模板1、当我们将区间 [l, r] 划分成 [l, mid] 和 [mid + 1, r] 时,其更新操作是 r = mid或者 l = mid + 1 ;计算mid时不需要加...原创 2020-02-11 22:41:14 · 168 阅读 · 0 评论 -
快速排序和归并排序
一、排序 O(nlogn)1.快速排序——分治思想难点在于划分 不稳定排序线性时间复杂度注意下标的边界问题 --> 背模板注意:快速排序过程中,如果每次取区间起点或者终点作为分界点,则会超时。分界点换成随机值,或者区间中点即可。当给定的序列有序时,如果每次选择区间左端点进行划分,每次会将区间[L, R]划分成[L, L]和[L + 1, R],那么相当于每次递归右半部分的...原创 2020-02-11 22:38:40 · 157 阅读 · 0 评论