随笔分类 -  算法模板

摘要:有根树从根、无根树从任意一个节点开始处理即可 1、不考虑边权,考虑路径中点的个数,可以从任意一个节点开始进行DFS,DFS返回以当前节点为根的子树中,以当前节点为端点的最长路径。 经过当前节点的最长路径,即为以当前节点的子节点为端点的前2长的路径长度的和+1,并以此更新全局最长路径(直径)。 2、边 阅读全文
posted @ 2022-06-16 11:52 80k 阅读(28) 评论(0) 推荐(0) 编辑
摘要:背包问题可以用dp数组记录最大值。 可以新增另一个数组count,记录等于最大值的方案数, 这样,在算出最大值后,在求解一遍可以以最大值转移过来的方案数的和,即可得到最大值的方案数。 AcWing 11. 背包问题求方案数 代码如下: #include<bits/stdc++.h> using na 阅读全文
posted @ 2022-06-06 18:32 80k 阅读(22) 评论(0) 推荐(0) 编辑
摘要:二进制优化代码比单调队列优化代码更清晰好写。 可以将一维优化成log级别。 其思想是,将数量s,1+2+4+...+s0,对1、2、4、...、s0分别打包, 则小于s的任意一个数量均可由这些打包表示出来。 这样数量为s的多重背包,可分解为这些打包的01背包。 注意,由于此时物品数量增多,必须优化d 阅读全文
posted @ 2022-06-06 00:10 80k 阅读(147) 评论(0) 推荐(0) 编辑
摘要:求 a/b(mod p) 其中,p是一个质数。 由费马小定理,有: b^(p-1)=1(mod p) 故 b^(p-2)=b^(-1)(mod p) 故 a/b(mod p) =a*b^(-1)(mod p)=a*b^(p-2)(mod p) 其中b^(p-2)可以用快速幂求解 注意:每一步都要取模 阅读全文
posted @ 2022-06-03 21:08 80k 阅读(243) 评论(0) 推荐(0) 编辑
摘要:AtCoder Beginner Contest 252 E - Road Reduction https://atcoder.jp/contests/abc252/editorial/4005 可以证明,总可以构建出一个生成树,使某一点到其余点的距离,等于原图中某一点到其余点的最小距离。 证明方法 阅读全文
posted @ 2022-05-23 17:24 80k 阅读(75) 评论(0) 推荐(0) 编辑
摘要:例题 AcWing 1010. 拦截导弹 建立最长下降子序列模型。 同时对于最少需要配备的系统数,可以利用贪心法,判断添加新系统还是放入某个旧系统中(若放入旧系统,则选择大于当前导弹高度的最小值,同时可以发现系统当前高度单调上升,可二分)。 AcWing 187. 导弹防御系统 上一题的拓展,由于有 阅读全文
posted @ 2022-05-19 22:03 80k 阅读(32) 评论(0) 推荐(0) 编辑
摘要:多重背包问题可以用单调队列进行优化 原理见:提高课1.3.1 背包模型(一) 离题:6. 多重背包问题 III 单调队列的deque实现如下: #include<bits/stdc++.h> using namespace std; int v[1010]; int w[1010]; int s[1 阅读全文
posted @ 2022-05-19 21:45 80k 阅读(33) 评论(0) 推荐(0) 编辑
摘要:在进行普通的BFS时,会将新的节点加入队尾。 但是由于01BFS的路径长度可能为0,故使用双端队列记录节点。如果路径为0,则加入队头,否则加入队尾。 例题:LCP 56. 信物传送 leetcode 2290. 到达角落需要移除障碍物的最小数目 class Solution { public: in 阅读全文
posted @ 2022-04-25 08:31 80k 阅读(37) 评论(0) 推荐(0) 编辑
摘要:基数排序的思想是,对于一个给定的基数,每次排序构建基数数量的桶,并将数分配到桶里。 可以用count数组对桶中的数量计数,并转化为前缀数组记录桶中数字的位置。 LeetCode 164. 最大间距题解 class Solution { public: int maximumGap(vector<in 阅读全文
posted @ 2022-04-15 10:19 80k 阅读(36) 评论(0) 推荐(0) 编辑
摘要:#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) for(LL x=(y);x<(z);x 阅读全文
posted @ 2022-04-02 08:45 80k 阅读(11) 评论(0) 推荐(0) 编辑
摘要:对质数p 根据费马小定理 有a^(p-1)≡1(mod p)(其中的p-1是p的欧拉函数,见数论的欧拉定理) 则a*a^(p-2)≡1(mod p) a^(p-2)≡1/a(mod p) 即有,1/a(逆元)≡a^(p-2)(mod p) 阅读全文
posted @ 2022-01-31 10:56 80k 阅读(32) 评论(0) 推荐(0) 编辑
摘要:一、质数 质数是大于1的自然数,只包含1和本身两个约数。 1、质数的判定,O(sqrt(n)) 试除法,推荐循环i<=n/i(防止溢出和sqrt计算) 2、分解质因子,O(logn~sqrt(n)) 1 for(int i=2;i<=n/i;i++) 2 { 3 if(n%i==0) 4 {//此时 阅读全文
posted @ 2022-01-01 18:12 80k 阅读(68) 评论(0) 推荐(0) 编辑
摘要:一、最小生成树 1、prim算法 和dijkstra算法很像 (1)朴素版 O(n^2) 适合稠密图 dijkstra算法每次更新到起点的距离,prim算法每次更新到集合的最短距离(用邻接点到当前被加入点的距离更新)(集合为已经生成的树) 858 Prim算法求最小生成树 1 #include<io 阅读全文
posted @ 2021-12-31 11:38 80k 阅读(51) 评论(0) 推荐(0) 编辑
摘要:最短路问题 一、单源最短路(一个点到所有点的最短距离) 1、所有边的权重都为正 n个点,m个边 (1)朴素dijkstra O(n^2) 适合稠密图,O(n^2)=O(m) 算法步骤: ①初始化距离 dis[1]=0,dis[i]=+∞,集合s为已经找到的点的集合 ② for i=1:n 找到点t, 阅读全文
posted @ 2021-12-28 10:43 80k 阅读(137) 评论(0) 推荐(0) 编辑
摘要:整数哈希: 一般可以用取模的方式,模的数(数组长度)最好取质数且离2的幂尽可能远 哈希冲突可以用拉链法和开放寻址法解决 拉链法可以用链表进行模拟,插入时在哈希寻址处的链表头结点插入 开放寻址法则直接向后找(经验值,数据长度一般要开到题目数据范围的2-3倍),利用find函数找到数据的位置或应该插入的 阅读全文
posted @ 2021-12-23 10:43 80k 阅读(66) 评论(0) 推荐(0) 编辑
摘要:并查集支持操作: 1、将两个集合合并 2、询问两个元素是否在一个集合当中 每个集合用一棵树来表示,以根节点编号表示整个集合,每个节点存储父节点p[x] 判断树根 if(p[x]==x) 求集合编号 while(p[x]!=x) x=p[x]; 合并集合:x和y,x→根节点x,p[x]=y。 优化:路 阅读全文
posted @ 2021-12-19 19:16 80k 阅读(152) 评论(0) 推荐(0) 编辑
摘要:Trie树可以用来存储前缀字符串/数组。 可以用数组进行模拟 son[N][26] 记录节点的son cnt[N] 记录以当前节点为最后字符的字符串出现的次数 idx当前用到的节点 例题 143. 最大异或对 #include<iostream> using namespace std; const 阅读全文
posted @ 2021-12-19 18:51 80k 阅读(67) 评论(0) 推荐(0) 编辑
摘要:KMP用于o(n)的字符串匹配。 使用next数组记录以当前阶段为后缀的,和以开始位置为前缀匹配的最长长度,即匹配过程中进行后移后保留的长度。 next数组的计算和匹配过程类似。 推荐数组从1开始计数 注意,自身match时,是不包含当前位置的前缀,而互相match时,是包含当前位置的前缀,所以两次 阅读全文
posted @ 2021-12-12 15:40 80k 阅读(109) 评论(0) 推荐(0) 编辑
摘要:用于数据范围大但稀疏的数据 unique可以用来去重; unique(v.begin(),v.end()); 返回值指向最后一个无重复元素的下一位; 可以用 v.erase(unique(v.begin(),v.end()),v.end())去除有序数组中的重复元素。 对有序无重复数组,查找可以使用 阅读全文
posted @ 2021-12-11 10:50 80k 阅读(66) 评论(0) 推荐(0) 编辑
摘要:前缀和可以快速求部分和有一维和二维的实现。数组的下标最好从1开始前缀和下标从0开始,以统一求a1~ai时的接口 差分主要用于对某个区间同时进行加减前缀和的逆运算可以用o(n)的时间恢复原数组d[i]=a[i]-a[i-1];AcWing 797. 差分#include<iostream> using 阅读全文
posted @ 2021-12-09 10:47 80k 阅读(59) 评论(0) 推荐(0) 编辑

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