随笔分类 -  算法模板

摘要:01字典树用于处理数字的前缀 例题: https://codeforces.ml/contest/1720/problem/D2 题解: https://www.bilibili.com/video/BV1mG4y1a7QS?spm_id_from=333.1007.top_right_bar_wi 阅读全文
posted @ 2022-08-22 16:40 80k 阅读(13) 评论(0) 推荐(0) 编辑
摘要:https://codeforces.ml/contest/1712/problem/E2 题解: https://www.bilibili.com/video/BV1uB4y167ig?spm_id_from=333.1007.top_right_bar_window_view_later.con 阅读全文
posted @ 2022-08-22 10:24 80k 阅读(15) 评论(0) 推荐(0) 编辑
摘要:对于单次查询,可以直接用sqrt(n)遍历。 对于多次查询,每次都遍历会遍历多个无用的数。 可以采用打表法,直接获取数据范围内的全部数据的因子。 代码如下: int N = 100010; vector<int> factor[100010]; for (int i = 1; i <= N; i++ 阅读全文
posted @ 2022-08-22 09:59 80k 阅读(7) 评论(0) 推荐(0) 编辑
摘要:如果可以确定先入队的距离一定更小的话,则可以(先判断是否为初始值,如果是初始值,可以入队,则)在入队的时候记录距离,例如边权为1的BFS。 如果不能确定, 例如01BFS,可能先对1入队,再对0入队, 由于可以确保出队时是有序的,可以在出队时记录(类似dijkstra), 也可以在入队时记录距离(当 阅读全文
posted @ 2022-08-13 11:32 80k 阅读(40) 评论(0) 推荐(0) 编辑
摘要:两个数的LCM的常规求法为,两数之积/GCD, 对于多个数也可以分别以此方法求出。 但是对于数据量较大的数,LCM会超过数据范围, 此时可以采用,记录质因子的数量的方法。 用一个数组,记录全部质因子的最大数量。 然后遍历每个数,求出其全部质因子的数量,并更细全局的质因子最大数量。 最后将全部的质因子 阅读全文
posted @ 2022-08-10 12:10 80k 阅读(385) 评论(0) 推荐(0) 编辑
摘要:开放地址法 M一般是N的十倍左右 find用于查找,看返回值是否为INF find用于插入,直接将待插入的值放到find返回的位置 会比unordered_set快5-10倍。 阅读全文
posted @ 2022-08-08 12:37 80k 阅读(23) 评论(0) 推荐(0) 编辑
摘要:https://ac.nowcoder.com/acm/contest/38105/D #include<bits/stdc++.h> typedef unsigned long long LL; using namespace std; LL digit = 1e13; LL nums[20001 阅读全文
posted @ 2022-08-05 11:02 80k 阅读(13) 评论(0) 推荐(0) 编辑
摘要:set的比较函数必须写成仿函数(class、struct、lambda) 而不能写成函数 且operator()的参数和函数都需要用const修饰 举例: struct cmp { bool operator()(const pair<int, string>& p1,const pair<int, 阅读全文
posted @ 2022-07-24 10:53 80k 阅读(225) 评论(0) 推荐(0) 编辑
摘要:LL GCD(LL a, LL b) { return b == 0 ? a : GCD(b, a % b); } View Code 此写法可以防止%0出现浮点数错误 阅读全文
posted @ 2022-07-11 20:48 80k 阅读(15) 评论(0) 推荐(0) 编辑
摘要:操作: pushup:由子节点算父节点信息 build:建立线段树,将一段区间初始化为线段树 modify:修改,修改某个点,或修改某个区间(需要使用pushdown) query:查询,查询某一段区间的信息 pushdown:父节点修改传递到子节点修改(懒标记) 原理: 满二叉树: 节点编号: 一 阅读全文
posted @ 2022-07-11 16:59 80k 阅读(40) 评论(0) 推荐(0) 编辑
摘要:pair_hash struct PairHash { size_t operator()(const pair<int,int>& p) const { return hash<int>{}(p.first)^ hash<int>{}(p.second); } }; View Code vecto 阅读全文
posted @ 2022-07-09 21:35 80k 阅读(96) 评论(0) 推荐(0) 编辑
摘要:解决的问题: 1、快速求前缀和(logn)(区间求和) 2、修改某一个数(logn)(单点修改) 对比:数组:求前缀和On,修改O1;前缀和数组:求前缀和O1,修改On C[x]表示,以x结尾,长度为lowbit(x)的区间中的计数 查询: 修改: 模板: int a[200010]; LL tr[ 阅读全文
posted @ 2022-07-09 20:01 80k 阅读(29) 评论(0) 推荐(0) 编辑
摘要:for (int j = (i - 1) & i; j; j = (j - 1) & i) cout << j << endl; View Code 其中 i 为原始的数字,j为子集(二进制一) 阅读全文
posted @ 2022-07-08 17:13 80k 阅读(37) 评论(0) 推荐(0) 编辑
摘要:并查集基本操作: 1、合并两个集合 2、查询集合的代表元素(祖先节点) 优化方式: 1、路径压缩(合并查询复杂度都是logn) 2、按秩合并(每次合并将深度较小的合并到深度较大的,logn) 3、1+2可以达到O(α(n))≈O(1),α():反Ackermann函数 扩展: 1、记录集合大小 2、 阅读全文
posted @ 2022-07-07 19:11 80k 阅读(65) 评论(0) 推荐(0) 编辑
摘要:单调队列可以求出,区间内的最值。 对于二维的情况,可以先在每一行,用单调队列求出,行方向上的最值。 然后在行方向上的最值的基础上,在每一列,用单调队列求出列方向上的最值。 即可得到二维区间的最值。 例题: 1091. 理想的正方形 代码: #include<bits/stdc++.h> using 阅读全文
posted @ 2022-07-03 20:48 80k 阅读(26) 评论(0) 推荐(0) 编辑
摘要:对于曼哈顿距离存在另一种形式的计算: 等式右边两项分别对应于:x1和x2、y1和y2的大小关系相同和不同的情况。 这样做的好处是,对于多个(x2,y2)点,可以预处理出全部点的最大和最小的x2+y2、x2-y2,这样对于任意其他点,可以在O(1)计算出它和全部点的曼哈顿距离的最大值。 例题: htt 阅读全文
posted @ 2022-07-01 20:09 80k 阅读(399) 评论(0) 推荐(0) 编辑
摘要:在求组合数时,其除数有阶乘形式,会非常大。 所以需要用除法逆元记录。 有公式1/num=pow(num,P-2)(mod P),P是质数。 其中pow可以用QuickPow算法求出。 在阶乘递推时,可以有n!=(n-1)!*n;从前向后递推 阶乘的逆元在递推时,有1/(n!)=1/((n-1)!)/ 阅读全文
posted @ 2022-06-28 09:52 80k 阅读(138) 评论(0) 推荐(0) 编辑
摘要:若数位dp中的数字性质要求数字不含前导0,则可以考虑。 dp数组中保留存在前导0的数字种类。 在遍历每一位时,第一位从1开始,其他位从0开始。 然后再把位数低于当前数字的结果(不含前导0)累加。 (含有前导0时,则可以遍历每一位时都从0开始,最后也不用累加结果) (如果数字是否含有前导0对结果(数字 阅读全文
posted @ 2022-06-21 09:09 80k 阅读(60) 评论(0) 推荐(0) 编辑
摘要:数位DP的一般形式是: 在[X,Y]区间内,找到满足某种性质的数的个数。 技巧1:两端区间变为一边区间,计算[0, X]和[0, Y]在相减 技巧2:以树的方式考虑,从高位到低位,考虑枚举的数的当前位小于还是等于Y的当前位。 AcWing 1081. 度的数量 #include<bits/stdc+ 阅读全文
posted @ 2022-06-19 22:11 80k 阅读(45) 评论(0) 推荐(0) 编辑
摘要:AcWing 1073. 树的中心 #include<bits/stdc++.h> using namespace std; typedef long long LL; vector<int> adj[10010]; vector<int> w[10010]; int p[10010]; int w 阅读全文
posted @ 2022-06-16 13:02 80k 阅读(28) 评论(0) 推荐(0) 编辑

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