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