原 经典模板题汇总 - 普及算法。
这大概是为数不多的混在前几页各类神仙算法中的一个普及题单之一
这份题单收录了普及组经常涉及的算法的经典题目,帮助普及组选手复习整理算法。通过这个题单,你能了解到普及组都有哪些算法,并获得相关资源。以及,这份题单也能帮助你在考前快速复习学过的所有算法。 当然,对于每个具体算法还是要多练习。
每个 OIer 心目中的「普及组算法」是有差异的。这份题单只是基于本蒟蒻的经验的,如果你有更好的意见,欢迎私信探讨 qwq
普及组的经典题,包括:
在目录中列出了对算法的简单介绍,并给出了更多资源。
更名后,本提单将不再囿于每个算法一道“模板题”。有的算法会包含多道题,还会收录一些用到常见技巧的题目。
「高精度算法」 大于
可以用数组模拟整数,数组的每一位代表整数的每一位,这样基本能存下
高精度数的计算则是模拟小学时学过的竖式,按十进制位运算。
了解更多,请见 高精度计算 - OI Wiki。关于高精度除以低精度,请见 高精度除法:高精度除以低精度_NEFU_kadia的博客-CSDN博客。
请参考:数论基础 - OI Wiki 与 暴力做法 - 素数判定 - 素数 - OI Wiki。
请参考:斐波那契数列 - OI Wiki 与 卡特兰数 - OI Wiki。
请参考:递归 & 分治 - OI Wiki 与 快速幂 - OI Wiki。
请参考:进位制 - OI Wiki。
「桶排序」 桶排序是时间复杂度很优的一个排序算法,也是最好写的。
桶排序针对范围不大的一些数,方法是为每个可能的值建立一个「桶」,即数组 b[],b[i] 表示取值为
先遍历一遍所有数,在相应的桶记录(b[a[i]]++;),然后再顺序遍历一遍桶,一个值有几个数就打印几个数即可。
桶排序的复杂度是
事实上,刚刚所说的(以及这道模板题需要的)仅仅是一种特殊情况的桶排序。关于“真正的”桶排序,请阅读 桶排序(箱排序)原理及其时间复杂度详解,以及 桶排序 - OI Wiki。
「多关键字排序」 利用 C++ STL 的 sort() 可以方便实现结构体的排序。
方法一是自定义比较函数。比较函数应是一个返回值为布尔类型的函数,参数为两个该结构体类型的变量。如果传入的第一个结构体「大于」第二个结构体,则返回 true,否则返回 false。此种方法需要在 sort() 里传入一个比较函数的函数指针,形如:sort(a+1,a+n+1,cmp);。用这种方法还可以使 sort() 从大到小排序整数。关于这种方法,请阅读 结构体的sort排序 - wushuyng - 博客园。
另一种方法则更为直接,直接重载结构体的小于运算符。这种方法调用 sort() 则不需要更改,正常调用即可。关于重载运算符的方法,请阅读 C++ 重载运算符和重载函数 | 菜鸟教程
「冒泡排序」 法如其名,在冒泡排序执行过程中,将序列中较小的数会像冒泡一样移动到数列的顶部。冒泡排序执行
更详细的介绍,详见 冒泡排序 - OI Wiki。
「快速排序」 快速排序采取的分治的思想,将待排序序列分为两部分,通过交换元素的方式使前一部分中的数小于后一部分中的数,然后递归排序两个部分。
快速排序的复杂度是
STL 中的 sort() 的内部实现就是快速排序,但其经过优化,比起裸的快排,效率有显著的提升。
了解更多,请阅读 快速排序 - OI Wiki。
「归并排序」 同样采用分治思想,归并排序分为两步。
了解更多,请见 归并排序 - OI Wiki。
「逆序对」 在给定的数列
「字符串排序」 一般来说,包括本题的字符串的排序问题需要我们按照如下的规则来确定顺序。
「二分查找」 考虑在一个有序序列中查找一个数的问题。
一个朴素的算法是遍历整个序列,若给定数与当前数相等则输出下标,复杂度为
但是,有复杂度更优的算法。因为序列是有序的,我们将序列正中间的数与给定数比较。若给定数大于此数,因为序列是有序的,所以可以断定要找的数一定在后半段中,反之一定在前半段中。由此递归地处理,每比较一次会排除掉一半的数。因此,最多需要
了解更多,请见 二分查找 - 二分 - OI Wiki。如果你不知道什么是
「实数域二分」 如果要在实数域内进行二分查找(比如求一个定义域为非无穷集的函数的零点),也可以利用二分查找,但不像整数,按照「取中间值」的方法是可以无限递归下去的,因此我们可以根据题目的要求设定一个精度
设定精度的方法也是与实数有关的问题中较常见的一种判等方法。
「二分答案」 二分法用途较窄,但其背后蕴含的二分思想则是近年竞赛的常考点。一般二分可解决的问题都是极值相关的问题(求某个量的最大/小值),这个时候我们可以二分这个量可能取的范围
关于二分答案需满足的条件以及更多例子,详见 二分答案 - 二分 - OI Wiki。
请参考: 递归 - 递归 & 分治 - OI Wiki
请参考:前缀和 - 前缀和 & 差分 - OI Wiki。
请参考:贪心 - OI Wiki。
请参考:栈 - OI Wiki 与 非递归 - 表达式求值 - OI Wiki。
请参考: 队列 - OI Wiki。
请参考:链表 - OI Wiki。
请参见:树基础 - OI Wiki 与 递归 - 表达式求值 - OI Wiki。
(以下两道题前面添加过)
请参见:堆简介 - OI Wiki 与 二叉堆 - OI Wiki。
想要练习更多,请前往我的数据结构题单:经典模板汇总 - 提高组数据结构
请参见:DFS(搜索)- OI Wiki,回溯法 - OI Wiki 与 记忆化搜索 - OI Wiki
请参见:BFS(搜索)- OI Wiki。
请参见:动态规划部分简介 - OI Wiki
请参见:0-1 背包 - 背包 DP - OI Wiki。
请参见:完全背包 - 背包 DP - OI Wiki。
请参见:分组背包 - 背包 DP - OI Wiki。
请参见:有依赖的背包 - 背包 DP - OI Wiki。
关于其他类型的背包问题,请参见 背包 DP - OI Wiki。
请参见:动态规划基础 - OI Wiki。
请参见:区间 DP - OI Wiki。
想要练习更多,请前往我的图论题单:经典模板汇总 - 提高组图论