常用算法模板
1|0由数据范围反推算法复杂度以及算法内容
模板来源:www.acwing.com
一般ACM或者笔试题的时间限制是1秒或2秒。
在这种情况下,C++代码中的操作次数控制在 10^7 ∼ 10^8为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
- n≤30, 指数级别, dfs+剪枝,状态压缩dp
- n≤100 => O(n^3),floyd,dp,高斯消元
- n≤1000 =>O(n^2) ,O(n^2logn),dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Ford
- n≤10000 => O(n∗√n),块状链表、分块、莫队
- n≤10^5 => O(nlogn) => 各种sort,线段树、树状数组、set/map、heap、拓扑排序、dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树
- n≤10^6 => O(n), 以及常数较小的O(nlogn)算法 => 单调队列、 hash、双指针扫描、并查集,kmp、AC自动机,常数比较小的O(nlogn)的做法:sort、树状数组、heap、dijkstra、spfa
- n≤10^7 => O(n),双指针扫描、kmp、AC自动机、线性筛素数
- n≤10^9 => O(√n),判断质数
- n≤10^18 => O(logn),最大公约数,快速幂,数位DP
- n≤10^1000 => O((logn)^2),高精度加减乘除
- n≤10^100000 => O(logk×loglogk),k表示位数,高精度加减、FFT/NTT
2|0代码模板1——基础算法
2|1快速排序算法模板 —— 模板题 AcWing 785. 快速排序
2|2归并排序算法模板 —— 模板题 AcWing 787. 归并排序
2|3整数二分算法模板 —— 模板题 AcWing 789. 数的范围
2|4浮点数二分算法模板 —— 模板题 AcWing 790. 数的三次方根
2|5高精度加法 —— 模板题 AcWing 791. 高精度加法
2|6高精度减法 —— 模板题 AcWing 792. 高精度减法
2|7高精度乘低精度 —— 模板题 AcWing 793. 高精度乘法
2|8高精度除以低精度 —— 模板题 AcWing 794. 高精度除法
2|9一维前缀和 —— 模板题 AcWing 795. 前缀和
2|10二维前缀和 —— 模板题 AcWing 796. 子矩阵的和
2|11一维差分 —— 模板题 AcWing 797. 差分
2|12二维差分 —— 模板题 AcWing 798. 差分矩阵
2|13位运算 —— 模板题 AcWing 801. 二进制中1的个数
2|14双指针算法—模板题 AcWIng 799. 最长连续不重复子序列,AcWing 800. 数组元素的目标和
常见问题分类:
(1) 对于一个序列,用两个指针维护一段区间
(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
2|15离散化 —— 模板题 AcWing 802. 区间和
2|16区间合并 —— 模板题 AcWing 803. 区间合并
3|0代码模板2——数据结构
3|1单链表 —— 模板题 AcWing 826. 单链表
3|2双链表 —— 模板题 AcWing 827. 双链表
3|3栈 —— 模板题 AcWing 828. 模拟栈
3|4队列 —— 模板题 AcWing 829. 模拟队列
3|5单调栈 —— 模板题 AcWing 830. 单调栈
常见模型:找出每个数左边离它最近的比它大/小的数
3|6单调队列 —— 模板题 AcWing 154. 滑动窗口
常见模型:找出滑动窗口中的最大值/最小值
3|7KMP —— 模板题 AcWing 831. KMP字符串
3|8Trie树 —— 模板题 AcWing 835. Trie字符串统计
3|9并查集 —— 模板题 AcWing 836. 合并集合, AcWing 837. 连通块中点的数量
(1)朴素并查集:
(2)维护size的并查集:
(3)维护到祖宗节点距离的并查集:
3|10堆 —— 模板题 AcWing 838. 堆排序, AcWing 839. 模拟堆
3|11一般哈希 —— 模板题 AcWing 840. 模拟散列表
(1) 拉链法
(2) 开放寻址法
3|12字符串哈希 —— 模板题 AcWing 841. 字符串哈希
核心思想:将字符串看成P进制数,P的经验值是131或13331,取这两个值的冲突概率低
小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果
3|13C++ STL简介
vector, 变长数组,倍增的思想
pair<int, int>
string,字符串
queue, 队列
priority_queue, 优先队列,默认是大根堆
stack, 栈
deque, 双端队列
set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列
unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
bitset, 圧位
4|0代码模板3——搜索与图论
4|1树与图的存储
树是一种特殊的图,与图的存储方式相同。
对于无向图中的边ab,存储两条有向边a->b, b->a。
因此我们可以只考虑有向图的存储。
(1) 邻接矩阵:
(2) 邻接表:
4|2树与图的遍历
时间复杂度 O(n+m), n 表示点数,m 表示边数
(1) 深度优先遍历 —— 模板题 AcWing 846. 树的重心
(2) 宽度优先遍历 —— 模板题 AcWing 847. 图中点的层次
4|3拓扑排序 —— 模板题 AcWing 848. 有向图的拓扑序列
时间复杂度 O(n+m), n 表示点数,m 表示边数
4|4朴素dijkstra算法 —— 模板题 AcWing 849. Dijkstra求最短路 I
时间复杂是 O(n2+m), n 表示点数,m 表示边数
4|5堆优化版dijkstra —— 模板题 AcWing 850. Dijkstra求最短路 II
时间复杂度 O(mlogn), n 表示点数,m 表示边数
4|6Bellman-Ford算法 —— 模板题 AcWing 853. 有边数限制的最短路
时间复杂度 O(nm), n 表示点数,m 表示边数
注意在模板题中需要对下面的模板稍作修改,加上备份数组,详情见模板题。
4|7spfa 算法(队列优化的Bellman-Ford算法) —— 模板题 AcWing 851. spfa求最短路
时间复杂度 平均情况下 O(m),最坏情况下 O(nm), n 表示点数,m 表示边数
4|8spfa判断图中是否存在负环 —— 模板题 AcWing 852. spfa判断负环
时间复杂度是 O(nm), n 表示点数,m 表示边数
4|9floyd算法 —— 模板题 AcWing 854. Floyd求最短路
时间复杂度是 O(n3), n 表示点数
4|10朴素版prim算法 —— 模板题 AcWing 858. Prim算法求最小生成树
时间复杂度是 O(n2+m), n 表示点数,m 表示边数
4|11Kruskal算法 —— 模板题 AcWing 859. Kruskal算法求最小生成树
时间复杂度是 O(mlogm), n 表示点数,m 表示边数
4|12染色法判别二分图 —— 模板题 AcWing 860. 染色法判定二分图
时间复杂度是 O(n+m), n 表示点数,m 表示边数
4|13匈牙利算法 —— 模板题 AcWing 861. 二分图的最大匹配
时间复杂度是 O(nm), n 表示点数,m 表示边数
5|0代码模板4——数学知识
5|1试除法判定质数 —— 模板题 AcWing 866. 试除法判定质数
5|2试除法分解质因数 —— 模板题 AcWing 867. 分解质因数
5|3朴素筛法求素数 —— 模板题 AcWing 868. 筛质数
5|4线性筛法求素数 —— 模板题 AcWing 868. 筛质数
5|5试除法求所有约数 —— 模板题 AcWing 869. 试除法求约数
5|6约数个数和约数之和 —— 模板题 AcWing 870. 约数个数, AcWing 871. 约数之和
5|7欧几里得算法 —— 模板题 AcWing 872. 最大公约数
5|8求欧拉函数 —— 模板题 AcWing 873. 欧拉函数
5|9筛法求欧拉函数 —— 模板题 AcWing 874. 筛法求欧拉函数
5|10快速幂 —— 模板题 AcWing 875. 快速幂
求 m^k mod p,时间复杂度 O(logk)。
5|11扩展欧几里得算法 —— 模板题 AcWing 877. 扩展欧几里得算法
// 求x, y,使得ax + by = gcd(a, b)
5|12高斯消元 —— 模板题 AcWing 883. 高斯消元解线性方程组
5|13递归法求组合数 —— 模板题 AcWing 885. 求组合数 I
5|14通过预处理逆元求组合数 —— 模板题 AcWing 886. 求组合数 II
首先预处理出所有阶乘取模的余数fact[N],以及所有阶乘取模的逆元infact[N]
如果取模的数是质数,可以用费马小定理求逆元
int qmi(int a, int k, int p) // 快速幂模板
{
int res = 1;
while (k)
{
if (k & 1) res = (LL)res * a % p;
a = (LL)a * a % p;
k >>= 1;
}
return res;
}
5|15Lucas定理 —— 模板题 AcWing 887. 求组合数 III
5|16分解质因数法求组合数 —— 模板题 AcWing 888. 求组合数 IV
当我们需要求出组合数的真实值,而非对某个数的余数时,分解质因数的方式比较好用:
1. 筛法求出范围内的所有质数
2. 通过 C(a, b) = a! / b! / (a - b)! 这个公式求出每个质因子的次数。 n! 中p的次数是 n / p + n / p^2 + n / p^3 + ...
3. 用高精度乘法将所有质因子相乘
5|17卡特兰数 —— 模板题 AcWing 889. 满足条件的01序列
5|18NIM游戏 —— 模板题 AcWing 891. Nim游戏
给定N堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。
我们把这种游戏称为NIM博弈。把游戏过程中面临的状态称为局面。整局游戏第一个行动的称为先手,第二个行动的称为后手。若在某一局面下无论采取何种行动,都会输掉游戏,则称该局面必败。
所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对面面临必败局面,则优先采取该行动。同时,这样的局面被称为必胜。我们讨论的博弈问题一般都只考虑理想情况,即两人均无失误,都采取最优策略行动时游戏的结果。
NIM博弈不存在平局,只有先手必胜和先手必败两种情况。
公平组合游戏ICG
若一个游戏满足:
由两名玩家交替行动;
在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;
不能行动的玩家判负;
则称该游戏为一个公平组合游戏。
NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件2和条件3。
5|19有向图游戏
给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。
5|20Mex运算
设S表示一个非负整数集合。定义mex(S)为求出不属于集合S的最小非负整数的运算,
即:mex(S) = min{x}, x属于自然数,且x不属于S
5|21SG函数
在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1, y2, …, yk,定义SG(x)为x的后继节点y1, y2, …, yk 的SG函数值构成的集合再执行mex(S)运算的结果,
即:SG(x) = mex({SG(y1), SG(y2), …, SG(yk)})
特别地,整个有向图游戏G的SG函数值被定义为有向图游戏起点s的SG函数值,即SG(G) = SG(s)。
5|22有向图游戏的和 —— 模板题 AcWing 893. 集合-Nim游戏
设G1, G2, …, Gm 是m个有向图游戏。定义有向图游戏G,它的行动规则是任选某个有向图游戏Gi,并在Gi上行动一步。G被称为有向图游戏G1, G2, …, Gm的和。
有向图游戏的和的SG函数值等于它包含的各个子游戏SG函数值的异或和,即:
SG(G) = SG(G1) ^ SG(G2) ^ … ^ SG(Gm)
定理
有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0。
有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0。
__EOF__

本文链接:https://www.cnblogs.com/zzybk/p/15779820.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性