随笔分类 - Algorithm
摘要:注意这里是构造了一个解,ti由于Mi与mi互质,可以用ExGCD求解 例题:https://www.acwing.com/problem/content/1300/ 模板: #include<bits/stdc++.h> using namespace std; typedef long long
阅读全文
摘要:在求a*b%MOD的时候,如果MOD>1e10,则即便使用a%MOD*b%MOD,依旧有可能会爆long long 故可以利用和快速幂相似的思想,将乘法按位转化为加法,避免报long long 龟速乘模板: LL SlowMul(LL a,LL k,LL MOD) { LL res=0; while
阅读全文
摘要:拓展欧几里得算法: 1、模板:https://www.cnblogs.com/ydUESTC/p/16676229.html 2、原理: 3、应用:拓展欧几里得算法解线性同余方程: 4、例题: (1)线性同余方程: https://www.acwing.com/problem/content/205
阅读全文
摘要:对获取所有约数有一个优化。 首先朴素的作法是,枚举sqrt(n)。 但是实际上,2e9范围以内的数字最多有1600个约数,但是sqrt(n)会到达50000左右。 对于多组测试数据, 可以考虑先筛sqrt(n)以内的质数,然后对num进行质因子分解O(sqrt(n)/ln(sqrt(n)))<O(s
阅读全文
摘要:例题: 1、求区间中的质数 筛质数是O(n)或O(nloglogn) 但是如果n很大,则会超时。 但是如果要筛[l, r]区间中的全部质数 且l和r比较大,但是r-l比较小时。 可以用O(nloglogn)的时间筛出,其中n=sqrt(N)。可以降低时间复杂度。 有对一个数n,如果是合数,则一定有小
阅读全文
摘要:AC自动机=Trie+kmp 优化:Trie图 1、kmp 长字符串s和模板串p都以下标1开始。 (1) 求next数组:kmp的next数组存的是p的自匹配,即以p[i]为结尾的后缀能够匹配的最长非平凡(不是自身)前缀。由于非平凡,next[0]=next[1]=0,循环从2开始。 (2)进行匹配
阅读全文
摘要:1、基本性质 tree+heap=treap 平衡树包含treap 红黑树 splay sbt AVL等等 splay比较常用 treap= ①BST 二叉搜索树 + ②heap 2、set不能做的操作 ⑤和⑥这种与排名相关的操作比较困难 3、treap的实现 思想:让二叉搜索树尽量变得随机(以大根
阅读全文
摘要:可持久化的前提:数据结构本身的拓扑结构不变 trie、线段树、树状数组、堆等都可持久化 平衡树(一般)需要左旋和右旋,不可持久化 可持久化希望将数据结构的全部修改记录下来(历史版本) 核心思想:只记录每一个版本与前一个版本不一样的地方 1、可持久化Trie 可以发现,绿线表示同一个点,但是下方的子树
阅读全文
摘要:例题:求解多个长方形之并的面积 https://www.acwing.com/problem/content/249/ 蓝色表示长方形,红色表示扫描线 如下图所示,对于每一个横向的区间,在纵向维护线段树 根据纵向的累计长度,即可对每个横向区间求出面积 求面积的过程中,可以从左到右遍历区间(遍历除第一
阅读全文
摘要:pushup是由子节点算父节点 对于懒标记线段树,需要有pushdown函数,将修改向下传播。 对于一个懒标记add,其意义为,给以当前节点为根的子树中(不包含自己)的每一个节点加上add。 查询时,需要将祖先节点上的add值累加到当前节点。 实现方法是,在查询过程中,如果需要递归,则将add标记清
阅读全文
摘要:当出现问题要求,对左侧n个点和右侧m个点之间,全部建立边时,时间复杂度最坏是O(n^2) 可能会超时。 这是可以采用建立中间点,将左侧连接到中间点,再将中间点连向右侧。 这样建边的复杂度会降到O(n) 例题: https://www.acwing.com/problem/content/descri
阅读全文
摘要:bitset可以更快的求大量位的表示和运算 两个bitset<n> 之间可以直接做与或非异或操作 同时也可以使用set、count等位操作 操作方法: 1、https://blog.csdn.net/JAN6055/article/details/123543847 2、https://fanfan
阅读全文
摘要:定义:经过每一条边且每一条边恰好只经过一次 一、无向图中,当所有边都连通时: 存在欧拉路径,等价于,图中度为奇数的点只有0或2个。 存在欧拉回路,等价于,图中度为奇数的点只有0个。 二、有向图中,当所有边都连通时: 存在欧拉路径,充要条件,要么所有点的出度等于入度,要么除了两个点之外,其余所有点的出
阅读全文
摘要:例题: https://www.acwing.com/problem/content/345/ 模板: fore(k,1,n) { fore(i,1,n) { fore(j,1,n) { A_M[i][j]|=A_M[i][k]&A_M[k][j]; } } } View Code
阅读全文
摘要:1、性质:二分图,等价于不存在奇数环、用染色法染色没有矛盾。 染色法求二分图模板: int n,m; const int N=20010; vector<int> adj[N]; vector<int> cost[N]; int color[N];//0表示未染色,1白色,2黑色 bool DFS(
阅读全文
摘要:一、定义: 1、极大的不含有桥(割边)的连通块称为边双连通分量。 性质: (1)边双连通分量,不管删掉哪条边,还是连通的 (2)任意两点间都有两条(边)不相交的路径 2、极大的不含有割点的连通块称为点双连通分量。 性质: (1)每个割点至少属于两个点双连通分量 (2)割点和割边没什么关系 二、求解方
阅读全文
摘要:1、Tarjan算法求强连通分量: 强连通分量的点可能会向上联通。 维护两个时间戳。 模板: #include<bits/stdc++.h> using namespace std; const int N=10010; int n,m; vector<int> adj[N]; int dfn[N]
阅读全文
摘要:用于在树上的一段区间(两点间的路径上的所有边)整体增加一个值。 其中,每个结点的值代表着其向上联通的边的值。 方法为: 其中,d为差分数组,p为LCA(x,y) 且最终 val(x)=sum(d(u)),u为以x为根的子树中的全部节点 原理: 可以发现,对x,y,p的操作,仅对路径上的边对应的d有影
阅读全文
摘要:1、向上标记法 从节点向上查找,O(n) 2、倍增法,预处理O(nlogn),查询O(qlogn) 记录当前节点向上2^j 步的祖先是谁 记录当前节点的深度depth[i] 哨兵:节点0,且depth[0]=0。当fa[i][j]已经跳出这棵树时,fa[i][j]=0 步骤: (1) 先将两个节点跳
阅读全文
摘要:1、方法: 一般推荐方法(2),最差时间复杂度较低 模板: int n,m,w; const int N=510; vector<int> adj[N]; vector<int> cost[N]; int dis[N]; bool st[N]; int cnt[N]; bool SPFA() { m
阅读全文