09 2022 档案
摘要: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) 先将两个节点跳
阅读全文
摘要:要求满足多个形如xi<=xj+ck的不等式 此问题可转化为图论问题: 对于[1]的解释,可以用xj+c更新xi,如果最短路的dis[i]>dis[j]+ck,则可用dis[j]+ck更新dis[i] 对于[2]的解释,x0=0,此时可以将xi<=c的边与虚拟源点连接 对于[3]的解释,负环对应的不等
阅读全文
摘要:求解环上∑f/∑w的最大值,在SPFA求负环的课程中有提及: https://www.acwing.com/video/559/ 可以使用二分进行求解
阅读全文
摘要: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
阅读全文
摘要:次小生成树有性质: 例题: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)
阅读全文
摘要:一般使用kruskal(克鲁斯卡尔)(mlogm) 对于稀疏图,用朴素prim(n^2) prim:每次选择和当前已经构建出的连通块相连,且权重最小的边,加入当前连通块。 一共需要扩展(n-1)次 只能处理一个连通块,不能“生成森林” 例题:https://www.acwing.com/proble
阅读全文
摘要:二维数组做函数参数时,第一维可以省略,第二位不可省略,必须为一个常数。 例如: const int N=1000; void mul(int a[][N],int b[][N]) { } View Code
阅读全文
摘要:主要思路为,在Floyd过程中,找到环中最大值为k的最小环 解释: 以dp的视角看待Floyd算法,在循环到k时,已经获得了经过前k-1个点的最短路径。 设环中最大标号为k,则路径可以表示为:i->k->j->...->i i->k和k->j为直接相连,j->...->i为通过小于标号k的点相连。
阅读全文
摘要:问题:求和: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
阅读全文
摘要: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
阅读全文
摘要:https://atcoder.jp/contests/abc267/tasks/abc267_f 此题目首先有结论:距离树上任意一点距离最远的点,是直径的其中一个端点 https://www.cnblogs.com/ydUESTC/p/16664485.html 故对于一个查询u,k如果存在一个答
阅读全文
摘要:对于一棵树,定义点的距离为二者的最短路径长度,可以有 树的直径的端点为(L,R) 对于任意一点u,L或R为距离u最远的点。 证明: https://atcoder.jp/contests/abc267/editorial/4753
阅读全文
摘要:踩坑记录: 对于max_element(begin,end); 如果begin==end,则当前查找的区间范围为0, 此时,会直接返回begin,导致答案(可能)错误。
阅读全文
摘要: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]
阅读全文
摘要:例题: 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
阅读全文
摘要: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<(
阅读全文
摘要:例题: https://www.acwing.com/problem/content/description/1131/ 1、仅用dis数组记录,出队时记录最小距离(可能会导致重复入队) #include<bits/stdc++.h> #define fore(x,y,z) for(LL x=(y)
阅读全文
摘要:https://zhidao.baidu.com/question/367173891541492052.html 结果为C(N+K-1,K) 思想为上面的挨个放入。 或者 将每个箱子都先放入一个球,即N个箱子,放入N+K个小球,箱子非空,然后再使用隔板法,得到C(N+K-1,N-1)。 例题: h
阅读全文