随笔分类 -  算法模板

摘要:例题:求解多个长方形之并的面积 https://www.acwing.com/problem/content/249/ 蓝色表示长方形,红色表示扫描线 如下图所示,对于每一个横向的区间,在纵向维护线段树 根据纵向的累计长度,即可对每个横向区间求出面积 求面积的过程中,可以从左到右遍历区间(遍历除第一 阅读全文
posted @ 2022-09-27 19:34 80k 阅读(37) 评论(0) 推荐(0) 编辑
摘要:pushup是由子节点算父节点 对于懒标记线段树,需要有pushdown函数,将修改向下传播。 对于一个懒标记add,其意义为,给以当前节点为根的子树中(不包含自己)的每一个节点加上add。 查询时,需要将祖先节点上的add值累加到当前节点。 实现方法是,在查询过程中,如果需要递归,则将add标记清 阅读全文
posted @ 2022-09-27 17:32 80k 阅读(37) 评论(0) 推荐(0) 编辑
摘要:定义:经过每一条边且每一条边恰好只经过一次 一、无向图中,当所有边都连通时: 存在欧拉路径,等价于,图中度为奇数的点只有0或2个。 存在欧拉回路,等价于,图中度为奇数的点只有0个。 二、有向图中,当所有边都连通时: 存在欧拉路径,充要条件,要么所有点的出度等于入度,要么除了两个点之外,其余所有点的出 阅读全文
posted @ 2022-09-21 19:52 80k 阅读(28) 评论(0) 推荐(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 阅读全文
posted @ 2022-09-21 16:26 80k 阅读(15) 评论(0) 推荐(0) 编辑
摘要:1、性质:二分图,等价于不存在奇数环、用染色法染色没有矛盾。 染色法求二分图模板: int n,m; const int N=20010; vector<int> adj[N]; vector<int> cost[N]; int color[N];//0表示未染色,1白色,2黑色 bool DFS( 阅读全文
posted @ 2022-09-20 17:00 80k 阅读(40) 评论(0) 推荐(0) 编辑
摘要:一、定义: 1、极大的不含有桥(割边)的连通块称为边双连通分量。 性质: (1)边双连通分量,不管删掉哪条边,还是连通的 (2)任意两点间都有两条(边)不相交的路径 2、极大的不含有割点的连通块称为点双连通分量。 性质: (1)每个割点至少属于两个点双连通分量 (2)割点和割边没什么关系 二、求解方 阅读全文
posted @ 2022-09-19 16:20 80k 阅读(57) 评论(0) 推荐(0) 编辑
摘要:1、Tarjan算法求强连通分量: 强连通分量的点可能会向上联通。 维护两个时间戳。 模板: #include<bits/stdc++.h> using namespace std; const int N=10010; int n,m; vector<int> adj[N]; int dfn[N] 阅读全文
posted @ 2022-09-18 16:00 80k 阅读(23) 评论(0) 推荐(0) 编辑
摘要:用于在树上的一段区间(两点间的路径上的所有边)整体增加一个值。 其中,每个结点的值代表着其向上联通的边的值。 方法为: 其中,d为差分数组,p为LCA(x,y) 且最终 val(x)=sum(d(u)),u为以x为根的子树中的全部节点 原理: 可以发现,对x,y,p的操作,仅对路径上的边对应的d有影 阅读全文
posted @ 2022-09-17 10:51 80k 阅读(30) 评论(0) 推荐(0) 编辑
摘要:1、向上标记法 从节点向上查找,O(n) 2、倍增法,预处理O(nlogn),查询O(qlogn) 记录当前节点向上2^j 步的祖先是谁 记录当前节点的深度depth[i] 哨兵:节点0,且depth[0]=0。当fa[i][j]已经跳出这棵树时,fa[i][j]=0 步骤: (1) 先将两个节点跳 阅读全文
posted @ 2022-09-16 16:37 80k 阅读(74) 评论(0) 推荐(0) 编辑
摘要: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 阅读全文
posted @ 2022-09-14 15:31 80k 阅读(34) 评论(0) 推荐(0) 编辑
摘要:次小生成树有性质: 例题:https://www.acwing.com/problem/content/1150/ 代码: #include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #define forn(x,y,z) 阅读全文
posted @ 2022-09-13 22:26 80k 阅读(23) 评论(0) 推荐(0) 编辑
摘要:一般使用kruskal(克鲁斯卡尔)(mlogm) 对于稀疏图,用朴素prim(n^2) prim:每次选择和当前已经构建出的连通块相连,且权重最小的边,加入当前连通块。 一共需要扩展(n-1)次 只能处理一个连通块,不能“生成森林” 例题:https://www.acwing.com/proble 阅读全文
posted @ 2022-09-13 09:54 80k 阅读(52) 评论(0) 推荐(0) 编辑
摘要:主要思路为,在Floyd过程中,找到环中最大值为k的最小环 解释: 以dp的视角看待Floyd算法,在循环到k时,已经获得了经过前k-1个点的最短路径。 设环中最大标号为k,则路径可以表示为:i->k->j->...->i i->k和k->j为直接相连,j->...->i为通过小于标号k的点相连。 阅读全文
posted @ 2022-09-12 19:46 80k 阅读(32) 评论(0) 推荐(0) 编辑
摘要:问题:求和:1^k+2^k+...+n^k 例题: https://codeforces.com/contest/622/problem/F 代码: #include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y);x<=(z);x++) #defin 阅读全文
posted @ 2022-09-10 21:59 80k 阅读(200) 评论(0) 推荐(0) 编辑
摘要:exgcd用于计算,形如ax+by=c的解。 证明:参考:https://www.cnblogs.com/mrclr/p/9380300.html 1、利用exgcd求解ax0+by0=gcd(a,b)的一个解: LL ExGCD(LL a, LL b, LL &x, LL &y) { if (b 阅读全文
posted @ 2022-09-10 11:28 80k 阅读(32) 评论(0) 推荐(0) 编辑
摘要:1、AcWing基础课: 线性筛:(与线性筛质数对应) phi[1] = 1; for (int i = 2; i <= n; i ++) { if (!st[i]) { primes[cnt ++] = i; phi[i] = i - 1; } for (int j = 0; primes[j] 阅读全文
posted @ 2022-09-06 21:45 80k 阅读(45) 评论(0) 推荐(0) 编辑
摘要:例题: https://www.acwing.com/problem/content/description/922/ 代码: #include<bits/stdc++.h> using namespace std; int m, n; bool A_M[510][510]; int dis[510 阅读全文
posted @ 2022-09-05 16:23 80k 阅读(39) 评论(0) 推荐(0) 编辑
摘要:https://www.acwing.com/problem/content/1131/ #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<( 阅读全文
posted @ 2022-09-04 18:14 80k 阅读(15) 评论(0) 推荐(0) 编辑
摘要:例题: https://www.acwing.com/problem/content/description/1131/ 1、仅用dis数组记录,出队时记录最小距离(可能会导致重复入队) #include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y) 阅读全文
posted @ 2022-09-04 17:12 80k 阅读(28) 评论(0) 推荐(0) 编辑
摘要:KMP自动机可以在O(1)的时间内计算kmp。 KMP自动机数组kmp_auto[i][j]可以表示第i位为'a'+j时的最长前缀长度(此前缀可以包含自身)。 kmp[i]数组,表示第i位的最长前缀长度(不含自身) 可以有kmp[i]=kmp_auto[kmp[i-1]][str[i]-'a']; 阅读全文
posted @ 2022-08-30 20:35 80k 阅读(38) 评论(0) 推荐(1) 编辑

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