ACM 算法与数据结构库
文章平均质量分 75
算法笔记
幼儿算数
这个作者很懒,什么都没留下…
展开
-
AcWing 12. 背包问题求具体方案
12. 背包问题求具体方案 - AcWing题库0/1 背包求具体方案分析求具体方案实际上是判断每个物品是否被选倒推出 f[n][m]f[n][m]f[n][m] 是怎么求得的,和哪个状态相等,就代表了从哪个状态转移过来的实际上,动态规划求方案对应了最短路问题求路径字典序最小的处理:对于第一个物品,可能产生的三种情况,从前往后推只能选 →\to→ 必选只能不选 →\to→ 必定不选可选可不选 →\to→ 一定选择第一个物品(这样保证了字典序最小)在倒推状态转移路径的时候,只能原创 2021-07-10 16:56:01 · 132 阅读 · 0 评论 -
AcWing 8. 二维费用的背包问题 以 0/1 背包为例
8. 二维费用的背包问题 - AcWing题库二维费用的背包可以和 0/1背包,完全背包,多重背包…结合本题是和 0/1 背包结合有 NNN 件物品和一个容量是 VVV 的背包,背包能承受的最大重量是 MMM 。每件物品只能用一次,体积是 viv_{i}vi ,重量是 mim_{i}mi,价值是 wiw_{i}wi 。求解将哪些物品装入背包,可使物品总体积不超过背包容量,总重量不超过背包可承受的最大重量,且价值总和最 大。输出最大价值。分析集合:所有从前 iii 个物品中选,总体原创 2021-07-08 14:24:05 · 115 阅读 · 0 评论 -
高斯消元基础
高斯消元解决的问题在 O(n3)O(n^3)O(n3) 的时间复杂度内求解一个多元线性方程组{a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2......an1x1+an2x2+...+annxn=bn\left\{\begin{aligned}&a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1\\&a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2\\&...\\&a原创 2021-03-17 15:54:05 · 145 阅读 · 0 评论 -
二分图
二分图染色法(判断是不是二分图)时间复杂度:O(n+m)O(n+m)O(n+m)什么是二分图可以把所有的点分成两边,使得所有的边都是在集合之间的(集合内部没有边)二分图的性质一个图是二分图,当且仅当图中不含奇数环,等价于用染色法染色不存在矛盾(奇数环:环当中边的数量是奇数)必要性证明: 给定一个奇数环,可以推出一个点既在左边,又在右边充分性证明:从前往后遍历所有点,和黑色相邻的点是白色和白色相邻的点是黑色—由于图中不含奇数环,所以染色过程中一定没有矛盾(反证法:假设在染色过程中出现了矛盾原创 2021-03-16 09:45:41 · 178 阅读 · 0 评论 -
二分图基础
二分图基础染色法(判断是不是二分图)时间复杂度:O(n+m)O(n+m)O(n+m)什么是二分图可以把所有的点分成两边,使得所有的边都是在集合之间的(集合内部没有边)二分图的性质一个图是二分图,当且仅当图中不含奇数环(奇数环:环当中边的数量是奇数)必要性证明: 给定一个奇数环,可以推出一个点既在左边,又在右边充分性证明:从前往后遍历所有点,和黑色相邻的点是白色和白色相邻的点是黑色—由于图中不含奇数环,所以染色过程中一定没有矛盾(反证法:假设在染色过程中出现了矛盾,染色法for&n原创 2021-03-08 15:32:24 · 161 阅读 · 0 评论 -
Nim游戏
Nim游戏基础Nim游戏公平组合游戏ICG若一个游戏满足:由两名玩家交替行动;在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;不能行动的玩家判负;则称该游戏为一个公平组合游戏。NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件2和条件3。有向图游戏给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者原创 2021-02-25 16:11:08 · 353 阅读 · 0 评论 -
高斯消元
高斯消元解决的问题在 O(n3)O(n^3)O(n3) 的时间复杂度内求解一个多元线性方程组{a11x1+a12x2+...+a1nxn=b1a21x1+a22x2+...+a2nxn=b2......an1x1+an2x2+...+annxn=bn\left\{\begin{aligned}&a_{11}x_1+a_{12}x_2+...+a_{1n}x_n=b_1\\&a_{21}x_1+a_{22}x_2+...+a_{2n}x_n=b_2\\&...\\&a原创 2021-02-25 15:44:52 · 114 阅读 · 0 评论 -
堆
堆支持的操作插入一个数 heap[++size]=x; up(size)heap[++size]=x;\ up(size)heap[++size]=x; up(size)求这个集合中的最小值 heap[1]heap[1]heap[1]删除最小值 (把堆的最后一个元素覆盖到堆顶,再 downdowndown 堆顶)heap[1]=heap[size]; size−−; down(1);heap[1]=heap[size];\ size--;\ down(1原创 2021-02-10 16:43:40 · 120 阅读 · 0 评论 -
Trie树/字典树
Trie树/字典树作用用于高效的存储和查找字符串集合的一个数据结构食用范围字符串题,要么全是小写字母,要么全是大写字母,要么全是数字,字母的类型不多,不光可以存储字符串,也可以存储整数、二进制数。Codeint son[N][26], cnt[N], idx; //cnt存储以p结尾的单词的个数// 下标为0的点,既是根结点,又是空结点char str[N];void insert(char s[]) { int p = 0; for (int i = 0; s[i];原创 2021-02-10 16:43:05 · 97 阅读 · 0 评论 -
KMP
KMP思考方式暴力做法如何去优化next[i]next[i]next[i] 的含义:以 iii 为终点的后缀和从 111 开始的前缀相等并且后缀的长度最长e.g. next[i]=je.g. \ next[i]=je.g. next[i]=j 表示的是 p[1→j]p[1\to j]p[1→j] 这一段和 p[(i−j+1)→j]p[(i-j+1) \to j]p[(i−j+1)→j] 这段相等(如下图,红颜色段被绿颜色标出的两部分相等Code// s[]是长文本,原创 2021-02-10 16:42:42 · 175 阅读 · 0 评论 -
哈希表
哈希表存储结构把一堆复杂的数映射到从 0∼n(0≤n≤105∼6)0 \sim n (0\le n\le 10^{5\sim 6})0∼n(0≤n≤105∼6)e.g.e.g.e.g. 把从 0∼1090\sim 10^90∼109 的这样一堆数映射到从 0∼1050\sim 10^50∼105 大小的数据结构中,在一个比较大的值域中选择一些数插入,选择一些数查询哈希函数:xmod 105x\mod{10^5}xmod105 这样 xxx 的范围就在 0∼1050\sim 10^50∼105 之原创 2021-02-10 16:40:51 · 193 阅读 · 0 评论 -
差分
差分 前缀和的逆运算假象一个数组 bbb 使得数组 a=f(b)a=f(b)a=f(b) ,假设数组 aaa 全 000 ,那么数组 bbb 也是全 000 可以通过修改操作构造数组 bbb ,数组 aaa 的初值看成是所有插入操作一维差分给定一个数组 aaa,构造一个差分数组 bbb ,使得 a[i]=b[1]+b[2]+...+b[i]a[i]=b[1]+b[2]+...+b[i]a[i]=b[1]+b[2]+...+b[i]目的是给区间 L→RL\to RL→R 的一段加或减去一个值核心操作原创 2021-02-10 16:40:12 · 278 阅读 · 0 评论 -
并查集
并查集支持操作在 O(1)O(1)O(1) 时间内将两个集合合并询问两个元素是否在一个集合当中基本原理每个集合用一棵树表示,树根的标号就是整个集合的标号。每个节点存储他的父节点 p[x]p[x]p[x]如何判断树根p[x]=xp[x]=xp[x]=x 来判断如何求 xxx 的集合编号while(p[x]≠x) x=p[x]while(p[x]\ne x)\ x=p[x]while(p[x]=x) x=p[x] →\to→ 这一步时间复杂度较高优化:在原创 2021-02-10 16:39:33 · 99 阅读 · 0 评论 -
约数
约数试除法求约数Code//获取一个数的所有约数,从小到大 vector<int> get_divisors(int n) { vector<int> res; for(int i = 1; i <= n / i; i++) { //最多只要枚举到sqrt(n) if(n % i == 0) { res.push_back(i); if(i != n / i) res.push_back(n / i); //把它成对的约数push进vector原创 2021-02-10 16:37:39 · 121 阅读 · 0 评论 -
求组合数
求组合数Method 1 预处理出所有组合数的值数据范围询问次数 T=105,0≤a,b≤104T=10^5 ,0\le a,b\le 10^4T=105,0≤a,b≤104求解方法根据递推式 Cab=Ca−1b+Ca−1b−1,(0≤a,b≤104)C_{a}^{b}=C_{a-1}^{b}+C_{a-1}^{b-1},(0\le a,b\le 10^4)Cab=Ca−1b+Ca−1b−1,(0≤a,b≤104)从实际意义出发理解这个式子,从 aaa 个苹果中选 bbb 个苹果的方案数可原创 2021-02-10 16:28:18 · 134 阅读 · 0 评论 -
扩展欧几里得
扩展欧几里得食用范围给定 nnn 对正整数ai,bia_i,b_iai,bi,对于每对数,求出一组 xi,yix_i,y_ixi,yi ,使其满足 ai∗xi+bi∗yi=gcd(ai,bi)a_i∗x_i+b_i∗y_i=gcd(a_i,b_i)ai∗xi+bi∗yi=gcd(ai,bi)此等式存在的条件:gcd(a,m)∣bgcd(a,m)|bgcd(a,m)∣b 成立裴蜀定理对于任意正整数 a,ba,ba,b ,那么一定存在非零整数 x,yx,yx,y 使得 ax+by=原创 2021-02-10 16:26:11 · 127 阅读 · 0 评论 -
快速幂
快速幂食用范围在 O(logk)O(logk)O(logk) 的时间内求出 akmod pa^k \mod{p}akmodp 的结果,其中 a,p,k≤109a,p,k\le 10^9a,p,k≤109核心思想反复平方法,预处理出a20mod pa^{2^0}\mod{p}a20modpa21mod pa^{2^1}\mod{p}a21modpa22mod p....a^{2^2}\mod{p}....a22modp....a2logkmod pa^{2^{logk}}\mod{原创 2021-02-10 16:25:17 · 184 阅读 · 0 评论 -
质数
试除法判断质数因为一个数的因数都是成对出现的,比如 121212 的因数是 2,62,62,6 和 3,43,43,4 等等,所以我们只要枚举较小的那个因数就可以了,设较小的因数为 ddd ,要求的数为 nnn 则 $ \frac{n}{d}$ 和 ddd 都能整除 nnn ,即 d∣nd|nd∣n 且 nd∣n\frac{n}{d}|ndn∣n所以枚举时,只枚举 d≤ndd \le \frac{n}{d}d≤dn 的数整理得 d≤nd \le \sqrt{n}d≤nCode#include原创 2021-01-15 19:29:08 · 193 阅读 · 0 评论 -
二维前缀和
s(i,j)s(i,j)s(i,j) 的含义是:∑i,j=1in,jns[i][j]\sum_{i,j=1}^{i_n,j_n}s[i][j]∑i,j=1in,jns[i][j]考虑以下两个问题s(i,j)s(i,j)s(i,j) 如何计算S[i][j]=S[i−1][j]+S[i][j−1]−S[i−1][j−1]+a[i][j]S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+a[i][j]S[i][j]=S[i−1][j]+S[i][j−1]−S[i−1]原创 2021-01-09 15:44:08 · 203 阅读 · 0 评论 -
常用模板 UPD12/4
基础算法二分bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r) { while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; //写r=mid,不需要+1 // check()判断mi原创 2020-12-04 00:42:56 · 221 阅读 · 0 评论