12 2022 档案

摘要:状态压缩DP 蒙德里安的梦想 问题描述 求把 N×M 的棋盘分割成若干个 1×2 的长方形,有多少种方案。 例如当 N=2M=4 时,共有 5 种方案。当 N=2M=3 时,共有 3 种方案。 如下图所示: 输入格式 输入包含多组测试用例。 每组测试用例占一行,包含两个整 阅读全文
posted @ 2022-12-18 09:48 S!no 阅读(34) 评论(0) 推荐(0) 编辑
摘要:数位统计 DP 数位统计DP是与数字相关的一类计数问题。在这类题目中,一般给定一些限制条件,求满足限制条件的第 K 小的数是多少,或者求在区间 [L,R] 内有多少个满足限制条件的数。解决方法为先利用动态规划进行预处理,再基于拼凑思想,用“试填法”求出最终的答案。 题目链接:AcWing 3 阅读全文
posted @ 2022-12-18 09:47 S!no 阅读(114) 评论(0) 推荐(0) 编辑
摘要:计数类 DP 题目链接:AcWing 900. 整数划分 问题描述 一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2++nk,其中 n1n2nk,k1。 我们将这样的一种表示称为正整数 n 的一种 阅读全文
posted @ 2022-12-14 10:06 S!no 阅读(25) 评论(0) 推荐(0) 编辑
摘要:区间DP 到目前为止,我们介绍的线性 DP 一般从初态开始,沿着阶段的扩张向某个方问递推,直至计算出目标状态,区间 DP 也属于线性 DP 中的一种,它以“区间长度”作为 DP 的“阶段”,使用两个坐标(区间的左、右端点),描述每个维度。在区间 DP 中,一个状态由若干个比它更小且包含于它的区间所代 阅读全文
posted @ 2022-12-11 11:18 S!no 阅读(64) 评论(0) 推荐(0) 编辑
摘要:线性DP 线性DP 数字三角形 最长上升子序列(LIS)问题 最长上升子序列(LIS)问题 II 最长公共子序列(LCS)问题 最短编辑距离 编辑距离 具有线性“阶段”划分的动态规划算法被统称为线性DP。 数字三角形 题目链接:AcWing 898. 数字三角形 问题描述 给定一个共有 N 行的 阅读全文
posted @ 2022-12-11 11:18 S!no 阅读(44) 评论(0) 推荐(0) 编辑
摘要:博弈论 博弈论 NIM 博弈 台阶-Nim游戏 公平组合游戏ICG 有向图游戏 Mex 运算 SG 函数 有向图游戏的和 定理 集合-Nim游戏 拆分-Nim游戏 NIM 博弈 给定 n 堆物品,第 i 堆物品有 Ai 个。两位玩家轮流操作,每次操作可以任选一堆,拿走任意数量的物品(可 阅读全文
posted @ 2022-12-10 09:35 S!no 阅读(107) 评论(0) 推荐(0) 编辑
摘要:背包问题 背包问题 0/1 背包问题 完全背包 多重背包 二进制拆分法 分组背包 背包是线性 DP 中一类重要而特殊的模型,本文将其作为单独一部分进行总结整理。 0/1 背包问题 0/1 背包问题的模型如下: 给定 N 个物品,其中第 i 个物品的体积为 Vi ,价值为 Wi阅读全文
posted @ 2022-12-10 09:35 S!no 阅读(43) 评论(0) 推荐(0) 编辑
摘要:容斥原理 设 S1,S2,,Sn 为有限集合,|S| 表示集合 S 的大小,则: $$ \vert \bigcup\limits_{i=1}^{n}S_i \vert = \sum\limits_{i=1}^{n} \vert S_i \vert - \sum\limi 阅读全文
posted @ 2022-12-10 09:34 S!no 阅读(129) 评论(0) 推荐(0) 编辑
摘要:组合计数 组合计数 求组合数 I —— 预处理组合数 求组合数 II —— 预处理阶乘 求组合数 III —— 卢卡斯定理(Lucas) 求组合数 IV —— 高精度 满足条件的01序列 —— 卡特兰数 求组合数 I —— 预处理组合数 给定 n 组询问,每组询问给定两个整数 ab,请 阅读全文
posted @ 2022-12-10 09:34 S!no 阅读(145) 评论(0) 推荐(0) 编辑
摘要:高斯消元 高斯消元 高斯消元解线性方程组 高斯消元解异或线性方程组 高斯消元解线性方程组 通过初等行变换把增广矩阵化为阶梯型矩阵,并回代得到方程的解 适用于求解 包含 n 个方程,n 个未知数的多元线性方程组 前置知识:初等行(列)变换 把某一行乘一个非00的数 (方程的两边同时乘上一个非0 阅读全文
posted @ 2022-12-10 09:34 S!no 阅读(65) 评论(0) 推荐(0) 编辑
摘要:中国剩余定理 设 m1,m2,,mn 是两两互质的整数,m=i=1nmiMi=m/mi(除了 mi 之外其他所有 m 的乘积),ti 是线性同余方程 Miti=1(modmi) 的一 阅读全文
posted @ 2022-12-10 09:34 S!no 阅读(111) 评论(0) 推荐(0) 编辑
摘要:扩展欧几里得算法 扩展欧几里得算法 欧几里得算法/辗转相除法(Euclidean algorithm) 裴蜀定理(Bézout 定理) 扩展欧几里得算法(Extended Euclidean algorithm) 求解线性同余方程 欧几里得算法/辗转相除法(Euclidean algorithm) 阅读全文
posted @ 2022-12-10 09:34 S!no 阅读(101) 评论(0) 推荐(0) 编辑
摘要:快速幂 快速幂 快速幂 快速幂求逆元 快速幂 用于快速(在 O(logk) 的时间复杂度之内)求出 akmodp 的结果,1a,p,k109,核心是反复平方法。 算法思想: 预处理出这些值: $a^{2^0} \bmod p,a^{2^1} \bmod 阅读全文
posted @ 2022-12-10 09:34 S!no 阅读(27) 评论(0) 推荐(0) 编辑
摘要:欧拉函数 欧拉函数 用公式求欧拉函数 用筛法求欧拉函数 欧拉函数: 在数论中,对正整数 N,欧拉函数 φ(N) 是小于等于 N 的正整数中与 N 互质的数的数目。 若正整数 N 被唯一分解为 $N = p_1^{c_1}p_2^{c_2} \dots p_m^{c_ 阅读全文
posted @ 2022-12-10 09:33 S!no 阅读(175) 评论(0) 推荐(0) 编辑
摘要:约数 约数 约数的定义 算数基本定理的推论 正约数集合 正约数个数 正约数之和 一、试除法求约数 二、约数个数 三、约数之和 四、最大公约数 欧几里得算法 更相减损数 约数的定义 若整数 n 除以整数 d 的余数为 0,即 d 能整除 n,则称 dn 的约数,n 阅读全文
posted @ 2022-12-10 09:33 S!no 阅读(277) 评论(0) 推荐(0) 编辑
摘要:质数 质数 一、试除法判定质数 二、分解质因数 三、筛质数 3.1 朴素筛法 3.2 埃氏筛法(Eratosthenes 筛法) 3.3 欧拉筛法(线性筛法) 一、试除法判定质数 质数的定义:若一个正整数无法被除了1和它自身之外的任何自然数整除,则称该数为质数(或素数),否则称该正整数为合数。 整个 阅读全文
posted @ 2022-12-10 09:33 S!no 阅读(170) 评论(0) 推荐(0) 编辑
摘要:匈牙利算法 给定一个二分图,如: 匈牙利算法能够快速的计算出一种匹配方式,使得匹配的数量最多。注意,一个成功的匹配方式中,没有两条边是共用了同一个点的。 形象的说,这个问题可以理解成二分图两边分别是男生和女生,有连线的表示可以凑成一对,匈牙利算法就是用来计算最多能够凑成多少对(不存在脚踏多条船的情况 阅读全文
posted @ 2022-12-10 09:33 S!no 阅读(142) 评论(0) 推荐(0) 编辑
摘要:染色法判定二分图 如果一张无向图的 N 个节点(N2)可以分成 A,B 两个非空集合,其中 AB=,并且在同一集合内的点之间都没有边相连,那么称这张无向图为一张二分图。A,B 分别称为二分图的左部和右部。 定理: 一张无向图是二分图, 阅读全文
posted @ 2022-12-10 09:33 S!no 阅读(182) 评论(0) 推荐(0) 编辑
摘要:Kruskal 算法 首先,将所有边按照权重从小到大排序。这一步是Kruskal算法的性能瓶颈,时间复杂度为 O(mlogm) 。不过由于排序的时间复杂度常数很小,所以Kruskal算法实际上是很快的。 第二部从小到大枚举每条边 ab,边权为 w ,如果 阅读全文
posted @ 2022-12-10 09:33 S!no 阅读(35) 评论(0) 推荐(0) 编辑
摘要:Prim 算法 Prim算法用于求最小生成树问题,与Dijkstra算法非常相似。根据图的疏密程度,分为朴素Prim算法(稠密图,O(n2))、堆优化Prim算法(稀疏图,O(mlogn))。但对于稀疏图,Kruskal算法更好写,思路更加清晰简单,所以一般不使用堆优化Prim。本文我 阅读全文
posted @ 2022-12-10 09:32 S!no 阅读(165) 评论(0) 推荐(0) 编辑
摘要:Floyd 算法 Floyd 算法用于多源汇最短路问题。时间复杂度为 O(n3) 。 算法思想: 首先用邻接矩阵里的d[i][j]存储所有的边(重边的时候取min),然后就是三重循环,思路也是如果从i到k,再从k到j,这个距离(d[i][k] + d[k][j])能比d[i][j]小,就更新一 阅读全文
posted @ 2022-12-10 09:32 S!no 阅读(118) 评论(0) 推荐(0) 编辑
摘要:SPFA 算法 SPFA 算法 SPFA 求最短路 SPFA 判断负环 SPFA算法实际上是对Bellman-Ford算法的队列优化,也是用于在存在负权边的图上,求单源点最短路,一般情况下时间复杂度可以看作 O(m) ,最坏情况下时间复杂度是 O(nm) 。 虽然SPFA算法是对Bellma 阅读全文
posted @ 2022-12-10 09:32 S!no 阅读(125) 评论(0) 推荐(0) 编辑
摘要:Bellman-Ford 算法 Bellman-Ford算法用于在包含负权边的图上,求单源点最短路的问题,时间复杂度 O(nm) 。但是因为该算法的改进版SPFA,在求单源点最短路的问题上几乎总是优于Bellman-Ford算法,所以Bellman-Ford算法一般只应用在对边的数量有限制的最短 阅读全文
posted @ 2022-12-10 09:32 S!no 阅读(144) 评论(0) 推荐(0) 编辑
摘要:Dijkstra 算法 Dijkstra算法用于在所有边权都非负的图上,求单源点最短路。 设 n 是图上结点的数量,m 是边的数量。 朴素Dijkstra算法的时间复杂度是 O(n2) ,适合稠密图(点少边多); 堆优化版的Dijkstra算法的时间复杂度是 O(mlogn) 阅读全文
posted @ 2022-12-10 09:32 S!no 阅读(302) 评论(0) 推荐(0) 编辑
摘要:拓扑排序 计算拓扑序列的一个方式是,用BFS来尝试访问所有的节点,但是有一个约束就是只有入度为0的节点才能被加入到扩展队列里。每次从队列里取出一个节点,也就同时在图中将这个节点拆除,所以它的所有后继的节点都减少1,如果已经减少到0,那么就可以加入到队列中。 在上面的例子中,一开始只有a的入度是0,所 阅读全文
posted @ 2022-12-10 09:31 S!no 阅读(58) 评论(0) 推荐(0) 编辑
摘要:树与图的DFS与BFS 树与图的DFS与BFS DFS BFS 首先,树是一种特殊结构的图,所以树与图的存储是相同的,而图又分为有向图与无向图,对无向图我们可以在两个点之间添加两条边。 有向图的存储方式主要有两种 稀疏图(点多边少)一般用邻接表存储 稠密图(点少边多)一般用邻接矩阵存储。 在邻接表的 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(89) 评论(0) 推荐(0) 编辑
摘要:宽度优先搜索 BFS 宽度优先搜索 BFS 走迷宫 八数码 宽度优先搜索每次扩展当前结点的所有相邻结点,所以需要一个队列来维护要扩展的结点。由于宽度优先搜索每次都是把所有能到的下一步搜完,所以能够得到最短路径的解,所以一些不带权求最短路径的问题也可以直接用BFS解决。 注意,在扩展结点的某个下一结点 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(262) 评论(0) 推荐(0) 编辑
摘要:深度优先搜索DFS 深度优先搜索DFS 排列数字 n-皇后问题 按位搜索 按行搜索 深度优先搜索的思想简单来说就是“一条道走到黑”,也被称为“暴力搜索”,常用于解决需要给出所有方案的问题,因为它的搜索顺序就是能够得到一个完整的搜索路径(方案)后回溯再去搜索其它的方案。 排列数字 题目链接:AcWin 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(20) 评论(0) 推荐(0) 编辑
摘要:哈希表(Hash) 哈希表(Hash) 拉链法(开散列) 开放寻址法 字符串哈希 Hash 表又称为散列表,一般由 Hash 函数(散列函数)与链表结构共同实现。与离散化思想类似,当我们要对若干复杂信息进行统计时,可以用 Hash 函致把这些复杂信息映射到一个容易维护的值城内。因为值域变简单、范围变 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(130) 评论(0) 推荐(0) 编辑
摘要:堆 堆是一种数据结构,主要包含以下操作: 插入一个数:将该数插到最后的位置,进行一次up操作 求集合中的最小值:输出堆顶元素 删除任意一个元素:将要删除的元素与末尾元素交换,然后进行一次up和down操作 修改任意一个元素:将某位置的元素修改,然后进行一次up和down操作 删除最小值:交换堆顶元素 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(80) 评论(0) 推荐(0) 编辑
摘要:并查集(Disjoint-Set) 并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询的数据结构。详细地说,并查集包括如下两个基本操作: Get,查询一个元素属于哪个集合。 Merge,把两个集合合并成一个大集合。 为了具体实现并查集这种数据结构,我们首先需要定 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(178) 评论(0) 推荐(0) 编辑
摘要:Trie Trie(字典树)是一种用于实现字符串快速检索的多叉树结构。Trie 的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符 c ,就沿着当前节点的 c 字符指针,走向该指针指向的节点。下面详细讨论 Trie 的基本操作过程: 初始化:一棵空 Trie 仅包含一个根结点,该点 阅读全文
posted @ 2022-12-09 22:07 S!no 阅读(26) 评论(0) 推荐(0) 编辑
摘要:KMP KMP 算法,又称模式匹配算法,能够在线性时间内判定字符串 P[1N] 是否为字符串 S[1M] 的子串。并求出字符串 P 在字符串 S 中各次出现的位置。 首先,一个 O(NM) 的朴素做法是,尝试枚举字符串 S 中的每个位置 i,把字符 阅读全文
posted @ 2022-12-09 22:06 S!no 阅读(37) 评论(0) 推荐(0) 编辑
摘要:单调队列 单调队列算法很多时候用手写的模拟队列比较方便,因为很多时候需要双口出队的队列,主要是在队尾也有删除元素的需求。而模拟队列都是游标移动来限定队列中的所有元素,所以用模拟队列很自然的可以做到双端队列的操作。 单调队列一个经典应用就是求滑动窗口里的最大(或者最小)值。 算法步骤: 把该滑出的滑出 阅读全文
posted @ 2022-12-09 22:06 S!no 阅读(47) 评论(0) 推荐(0) 编辑
摘要:单调栈 题目链接:AcWing 830. 单调栈 时间复杂度:O(N) #include <iostream> using namespace std; const int N = 1e5 + 10; int n; int stk[N], tt; // 数组模拟栈,栈顶指针默认为0(空) int 阅读全文
posted @ 2022-12-09 22:06 S!no 阅读(21) 评论(0) 推荐(0) 编辑
摘要:队列 数组模拟队列 题目链接:AcWing 829. 模拟队列 #include <iostream> using namespace std; const int N = 100010; int n; int q[N]; int hh = 0, tt = -1; void push(int x) 阅读全文
posted @ 2022-12-09 22:06 S!no 阅读(22) 评论(0) 推荐(0) 编辑
摘要:栈 数组模拟栈 题目链接:AcWing 828. 模拟栈 #include <iostream> using namespace std; const int N = 100010; int n; int stk[N], tt; void push(int x) { stk[++ tt] = x; 阅读全文
posted @ 2022-12-09 22:06 S!no 阅读(20) 评论(0) 推荐(0) 编辑
摘要:双链表 题目链接:AcWing 827. 双链表 #include <iostream> using namespace std; const int N = 100010; int e[N], l[N], r[N], idx; void init() { // 头节点为0,尾节点为1,插入的节点标 阅读全文
posted @ 2022-12-09 22:05 S!no 阅读(11) 评论(0) 推荐(0) 编辑
摘要:单链表 题目链接:AcWing 826. 单链表 #include <iostream> using namespace std; const int N = 100010; int n; int e[N], ne[N], head, idx; void init() { idx = 0; head 阅读全文
posted @ 2022-12-09 22:05 S!no 阅读(12) 评论(0) 推荐(0) 编辑
摘要:区间合并 区间合并问题也是一个贪心问题,由于比较常用所以单独拿出来。区间合并的解决方法是,把所有区间按照左端点 l 从小到大排序,然后维护一个当前正在处理的区间 [st,ed],如果遍历到区间和维护的区间有交集,就合并(能合则合),没有交集的时候,当前维护的区间就变成这个遍历到的区间。 这里 阅读全文
posted @ 2022-12-09 22:05 S!no 阅读(273) 评论(0) 推荐(0) 编辑
摘要:离散化 离散化是一种辅助解决问题的操作,当问题中涉及的数据范围非常大,但是实际使用到的数据是比较少的。并且问题的求解是和它范围里的其它数据有关系的,那么可以将这些可能使用到的数据放到一起,排序去重,就将它们映射到了一个新的较小的范围里。 例如,下面几个数是在 (,) 阅读全文
posted @ 2022-12-09 22:05 S!no 阅读(71) 评论(0) 推荐(0) 编辑
摘要:位操作 lowbit原理 根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形式是补码,也就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作 题目链接:AcWing 801. 二进制中1的个数 #includ 阅读全文
posted @ 2022-12-09 22:05 S!no 阅读(37) 评论(0) 推荐(0) 编辑
摘要:双指针算法 双指针算法的核心思想就是在序列上找到这样一个性质,序列上的一个指针 j 随着另一个指针 i 的移动,是单向移动的,不会发生回退,这样就能在移动指针 i 的时候去移动指针 j。由于两个指针都最多只会把序列遍历一遍,所以时间复杂度往往是从 O(n2) 优化到 $O(n) 阅读全文
posted @ 2022-12-09 22:05 S!no 阅读(46) 评论(0) 推荐(0) 编辑
摘要:前缀和与差分 前缀和与差分 一维前缀和 差分 一维前缀和 前缀和可以用于快速计算一个序列的区间和,也有很多问题里不是直接用前缀和,但是借用了前缀和的思想。 用 s[i] 表示 a[0]+a[1]++a[i] 的和(所以称为前缀和),那么要计算区间 [l,r] 的和,也就是计算 阅读全文
posted @ 2022-12-09 22:04 S!no 阅读(40) 评论(0) 推荐(0) 编辑
摘要:高精度 高精度 高精度加法 高精度减法 高精度乘法 高精度除法 高精度加法 题目链接:AcWing 791. 高精度加法 题目描述 给定两个正整数(不含前导 0),计算它们的和。 输入格式 共两行,每行包含一个整数。 输出格式 共一行,包含所求的和。 数据范围 1 整数长度 $\le 1 阅读全文
posted @ 2022-12-09 22:04 S!no 阅读(74) 评论(0) 推荐(0) 编辑
摘要:二分 二分法用于解决这样一类问题:一个区间能分成左右两部分,左半部分满足性质 A,右半部分不满足性质 A。问题的目标是求解这两部分的分界点。 所以二分法和区间里有没有单调性其实没什么关系,但是很多问题里是从单调性导出了上面的性质,上面的性质才是一个问题能用二分法求解的最本质的性质。 二分法每 阅读全文
posted @ 2022-12-09 22:00 S!no 阅读(68) 评论(0) 推荐(0) 编辑
摘要:归并排序 归并排序的思想是基于分治法,其思路是: 将待排序区间平分成左右两半,左右两侧分别递归地做归并排序。 将这两个有序的区间合并(每次落一个较小的下来),就将这个区间排好序了。 归并排序相比快速排序,几乎没有什么难理解的边界问题。要注意代码中的q[i] <= q[j]时从左半边落下元素,如果改成 阅读全文
posted @ 2022-12-09 21:49 S!no 阅读(53) 评论(0) 推荐(0) 编辑
摘要:快速排序 算法思想 快排的思想是基于分治法,其思路是: 确定分界点:给定要排序的数组q,先在数组中找一个数作为分界点值x,分界点可以取左边界值x = q[l],可以取右边界值x = q[r],可以取数组中间的数x = q[l + r >> 1],也可以随机取一个。 调整区间:将数组划分成两个区间,使 阅读全文
posted @ 2022-12-09 21:33 S!no 阅读(170) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示