模板
~无相~
这个作者很懒,什么都没留下…
展开
-
约数之和/最大公约数模板
#include <iostream>#include <algorithm>#include <unordered_map>#include <vector>using namespace std;typedef long long LL;const int N = 110, mod = 1e9 + 7;int main(){ int n; cin >> n; unordered_map<i原创 2020-10-23 09:24:31 · 138 阅读 · 0 评论 -
试除法求约数模板/约数个数
vector<int> get_divisors(int x){ vector<int> res; for (int i = 1; i <= x / i; i ++ ) if (x % i == 0) { res.push_back(i); if (i != x / i) res.push_back(x / i); } sort(res.begin(), r原创 2020-10-23 09:14:45 · 164 阅读 · 0 评论 -
分解质因数模板
void divide(int x){ for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { int s = 0; while (x % i == 0) x /= i, s ++ ; cout << i << ' ' << s << endl; } if (x >原创 2020-10-23 09:12:16 · 100 阅读 · 0 评论 -
拓展欧几里得算法模板
int exgcd(int a, int b, int &x, int &y){ if (!b) { x = 1, y = 0; return a; } int d = exgcd(b, a % b, y, x); y -= a / b * x; return d;}原创 2020-10-22 13:44:15 · 93 阅读 · 0 评论 -
线性筛欧拉函数模板
const int N = 1010;int primes[N], cnt;bool st[N];int phi[N];void init(int n){ phi[1] = 1; for (int i = 2; i <= n; i ++ ) { if (!st[i]) { primes[cnt ++ ] = i; phi[i] = i - 1; } ..原创 2020-10-22 09:10:57 · 149 阅读 · 1 评论 -
快速幂模板
代码int qmi(int a, int k){ int res = 1; while (k) { if (k & 1) res = (LL)res * a % mod; a = (LL)a * a % mod; k >>= 1; } return res;}原创 2020-10-10 14:04:05 · 95 阅读 · 0 评论 -
阶乘分解模板
就是线性筛后不断分解即可代码#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 1000010;int primes[N], cnt;bool st[N];void init(int n){ for (int i = 2; i <= n; i ++ ).原创 2020-10-10 13:53:30 · 84 阅读 · 0 评论 -
AcWing 196. 质数距离(区间筛质数)
题目给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。同时,你还需要找到距离最远的两个相邻质数D1和D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。输入格式每行输入两个整数L和U,其中L和U的差值不会超过1000000。输出格式对于每个L和U ,输出一个结果,结果占一行。结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)如果L和U之间原创 2020-10-10 13:48:18 · 169 阅读 · 0 评论 -
线性筛模板
int primes[N], cnt;//primes记录下所有素数bool st[N];//用于判断某个数是不是素数void init(int n){ for (int i = 2; i <= n; i ++ ) { if (!st[i]) primes[cnt ++ ] = i; for (int j = 0; primes[j] * i <= n; j ++ ) { st[primes[j] *原创 2020-10-09 09:22:40 · 110 阅读 · 1 评论 -
AcWing 164. 可达性统计(每个点能到达的点的个数=拓扑排序+dp)
题目给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。输入格式第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边。输出格式输出共N行,表示每个点能够到达的点的数量。数据范围1≤N,M≤30000输入样例:10 103 82 32 55 95 92 33 94 82 104 9输出样例:1633211111思路题目求每一个点能到达点的个数,由于是有向无环图,那么可以用拓扑排序求出点与点之间的依赖原创 2020-09-28 13:27:28 · 655 阅读 · 0 评论 -
欧拉回路求字典序最小路径模板
#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 510;int n = 500, m;int g[N][N];int ans[1100], cnt;int d[N];void dfs(int u){ for (int i = 1; i <= n; i ++ ) if (g[u][i]原创 2020-09-27 10:01:28 · 278 阅读 · 0 评论 -
AcWing 1184. 欧拉回路
题目给定一张图,请你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。输入格式第一行包含一个整数 t,t∈{1,2},如果 t=1,表示所给图为无向图,如果 t=2,表示所给图为有向图。第二行包含两个整数 n,m,表示图的结点数和边数。接下来 m 行中,第 i 行两个整数 vi,ui,表示第 i 条边(从 1 开始编号)。如果 t=1 则表示 vi 到 ui 有一条无向边。如果 t=2 则表示 vi 到 ui 有一条有向边。图中可能有重边也可能有自环。点的编号从 1 到 n。原创 2020-09-27 09:31:42 · 219 阅读 · 0 评论 -
匈牙利算法:二分图最大匹配
#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 510, M = 100010;int n1, n2, m;int h[N], e[M], ne[M], idx;int match[N];bool st[N];void add(int a, int b){ e[idx] = b, ne[idx] = h[原创 2020-09-24 14:03:48 · 71 阅读 · 0 评论 -
染色法模板
#include <iostream>#include <queue>#include <cstring>#include <algorithm>using namespace std;const int N = 1e5 + 5;int h[N]; int ne[N * 2]; int e[N * 2];int idx;int n, m;int colour[N];void add(int a, int b) { e[idx] = b;原创 2020-09-24 13:31:14 · 155 阅读 · 0 评论 -
Acwing257. 关押罪犯(染色法+二分)
题目S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为 c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 c 的冲突事件。每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到 S 城 Z 市长那里。公务繁忙的 Z 市长只会去原创 2020-09-24 13:29:24 · 157 阅读 · 0 评论 -
Acwing396. 矿场搭建(tarjan割点的缩点)
思路题目要求删除一个点之后,其他任意一个点能到一个出口点,无向图连通问题的话我们肯定一开始就想到tarjan缩点了,但是这题目还需要分析怎么缩点对于不同连通块来说,答案肯定是独立的,最后只要把每一个连通块的答案乘起来即可接下来缩点,对于有割点的无向图来求缩点的话,需要对于割点进行特殊处理,如果一个点是割点就把它作为单独的一个点,然后连接上它周围的双连通分量。对于每一个连通块来说,如果连通块内没有割点的话,那么不论删除连通块的那一个点,都不会改变连通块的连通性,所以对于这样的连通块来说,需要2个出口原创 2020-09-24 09:16:38 · 100 阅读 · 0 评论 -
Acwing1183. 电力(求无向图删除一个点后连通块最大个数:tarjan割点)
题目给定一个由 n 个点 m 条边构成的无向图,请你求出该图删除一个点之后,连通块最多有多少。输入格式输入包含多组数据。每组数据第一行包含两个整数 n,m。接下来 m 行,每行包含两个整数 a,b,表示 a,b 两点之间有边连接。数据保证无重边。点的编号从 0 到 n−1。读入以一行 0 0 结束。输出格式每组数据输出一个结果,占一行,表示连通块的最大数量。数据范围1≤n≤10000,0≤m≤15000,0≤a,b<n输入样例:3 30 10 22 14 20原创 2020-09-23 15:37:31 · 862 阅读 · 0 评论 -
双连通分量+tarjan缩点模板
taijan视频讲解代码#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 5010, M = 20010;int n, m;int h[N], e[M], ne[M], idx;int dfn[N], low[N], timestamp;int stk[N], top;int id[N], dcc_cnt;boo原创 2020-09-23 15:07:30 · 137 阅读 · 0 评论 -
AcWing 1171. 距离(tarjan算法求公共祖先/求任意两点之间的距离)
题目给出 n 个点的一棵树,多次询问两点之间的最短距离。注意:边是无向的。所有节点的编号是 1,2,…,n。输入格式第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数;下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;再接下来 m 行,每行两个整数 x,y,表示询问点 x 到点 y 的最短距离。树中结点编号从 1 到 n。输出格式共 m 行,对于每次询问,输出一行询问结果。数据范围2≤n≤104,1≤m≤2×104,0<原创 2020-09-23 12:53:59 · 202 阅读 · 0 评论 -
公共祖先模板(DFS/Tarjan+倍增)
思路很裸的一个公共祖先题目步骤:先求出fa[u][j]表示u节点的第 j个祖先是哪个节点,将两个节点a,b初始化成在同一层每一层k,判断一下f[a][k]和f[b][k]是否相等来判断是否是他们的公共祖先代码#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N =原创 2020-09-23 10:31:26 · 82 阅读 · 0 评论 -
次小生成树模板(DFS/LCA)
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;const int N = 510, M = 10010;int n, m;struct Edge{ int a, b, w; bool f; bool operator< (c原创 2020-09-22 17:23:59 · 126 阅读 · 0 评论 -
AcWing 1165. 单词环 (边点)
题目我们有 n 个字符串,每个字符串都是由 a∼z 的小写英文字母组成的。如果字符串 A 的结尾两个字符刚好与字符串 B 的开头两个字符相匹配,那么我们称 A 与 B 能够相连(注意:A 能与 B 相连不代表 B 能与 A 相连)。我们希望从给定的字符串中找出一些,使得它们首尾相连形成一个环串(一个串首尾相连也算),我们想要使这个环串的平均长度最大。如下例:ababcbckjacacaahoynaab第一个串能与第二个串相连,第二个串能与第三个串相连,第三个串能与第一个串相连,我们按照此顺序原创 2020-09-22 16:58:52 · 137 阅读 · 0 评论 -
AcWing 361. 观光奶牛(二分+点权值变为边权值+判断正环)
思路题目要求一个环,满足sum(f[i])/sum(l[i])取最大值,f[i]为环上每个点的权值,l[i]为环上每个边的权值,这种一个数除以一个数取最大的,一般用二分,这题变一下形,sum(f[i])/sum(l[i])>=mid,变为sum(f[i])-sum(l[i])*mid>=0,mid为二分的最大值,这样可以把点的权值放在该点的出边上,因为这是在一个环上,所以经过一个点的环,该点的出边必然也在环上,所以可以这么做之后只要判断一下是否存在正环就可以了,即对于每一个mid判断是否存原创 2020-09-22 13:08:01 · 147 阅读 · 0 评论 -
AcWing 346. 走廊泼水节(已知最小生成树求最小完全图)
思路题目:要求把N个点的树扩充成完全图,并且该树还是这个完全图的最小生成树做法:要扩充成完全图也就是在建树的过程中把每次新加入的连通块和当前连通块中每一对点两两相连,如果要最后完全图的权值和最小,也就是每一次连连通块的时候的边最小,每一次连连通块的边必须要满足大于原来树中把这两个连通块连起来的边的权值,因为如果小于,该树就不再是最小生成树了,等于的话,就不是唯一的最小生成树,而且权值必须是整数,所以取书中权值代码#include <cstring>#include <iost原创 2020-09-22 09:54:35 · 123 阅读 · 0 评论 -
AcWing 1146. 新的开始(最小生成树:虚拟源点)
题目发展采矿业当然首先得有矿井,小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井,但他似乎忘记了考虑矿井供电问题。为了保证电力的供应,小 FF 想到了两种办法:在矿井 i 上建立一个发电站,费用为 vi(发电站的输出功率可以供给任意多个矿井)。将这口矿井 i 与另外的已经有电力供应的矿井 j 之间建立电网,费用为 pi,j。小 FF 希望你帮他想出一个保证所有矿井电力供应的最小花费方案。输入格式第一行包含一个整数 n,表示矿井总数。接下来 n 行,每行一个整数,第 i 个原创 2020-09-22 09:23:56 · 118 阅读 · 0 评论 -
Min_25筛
#include <bits/stdc++.h> using namespace std; const int N = 1000010; typedef long long LL; namespace Min25 { int prime[N], id1[N], id2[N], flag[N], ncnt, m; LL g[N], sum[N], a[N], T, n; inline int ID(LL x) { retur...转载 2020-09-21 18:53:32 · 92 阅读 · 0 评论 -
Kruskal算法模板
#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 110, M = 210;int n, m;struct Edge{ int a, b, w; bool operator< (const Edge &t)const { return w < t.w; }原创 2020-09-21 15:44:23 · 104 阅读 · 0 评论 -
prime算法模板
int dist[N];int g[N][N];int res;int n;bool st[N];void prime(){ for (int i = 0; i < n; i ++ ) { int t = -1; for (int j = 1; j <= n; j ++ ) if (!st[j] && (t == -1 || dist[t] > dist[j]))原创 2020-09-21 14:37:23 · 116 阅读 · 0 评论 -
用快速幂+Floyd算法求恰好经过N边模板
#include <cstring>#include <iostream>#include <algorithm>#include <map>using namespace std;const int N = 210;int k, n, m, S, E;int g[N][N];int res[N][N];void mul(int c[][N], int a[][N], int b[][N]){ static int temp原创 2020-09-21 14:16:09 · 60 阅读 · 0 评论 -
AcWing 343. 排序(传递闭包)
题目给定 n 个变量和 m 个不等式。其中 n 小于等于26,变量分别用前 n 的大写英文字母表示。不等式之间具有传递性,即若 A>B 且 B>C ,则 A>C。请从前往后遍历每对关系,每次遍历时判断:如果能够确定全部关系且无矛盾,则结束循环,输出确定的次序;如果发生矛盾,则结束循环,输出有矛盾;如果循环结束时没有发生上述两种情况,则输出无定解。输入格式输入包含多组测试数据。每组测试数据,第一行包含两个整数n和m。接下来m行,每行包含一个不等式,不等式全部为小于关系。原创 2020-09-19 14:41:30 · 171 阅读 · 0 评论 -
AcWing 383. 观光(次短路)
思路题目就是求下最短路和次短路,判断一下次短路是否是哦代码#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int N = 1010, M = 20010;struct Ver{ int id, type, dist; b原创 2020-09-19 13:53:45 · 103 阅读 · 0 评论 -
Acwing1134. 最短路计数
思路要求一个图的最短路径数,首先如果我们用dp的思想cnt[i]表示这个点的最短路径数,一旦这个点被x更新了,那么cnt[i]=cnt[t],如果两个路径距离相等就cnt[i]+=cnt[t],但是这样做要有个前提,必须顺序是拓扑的,因为cnt更新时候要保证dist[t]就是t这个点的最短路径,这题保证了没有权为0的环,所以这里最短路径树就是一个拓扑图,就可以直接用bfs或者dijkstra来做,因为bfs和dijkstra的更新顺序就是拓扑的,但是spfa不行,因为spfa更新的时候不能保证那个值就是原创 2020-09-19 12:14:40 · 162 阅读 · 0 评论 -
spfa判断负环模板
bool spfa(){ memset(dist, 0, sizeof dist); memset(cnt, 0, sizeof cnt); memset(st, 0, sizeof st); int hh = 0, tt = 0; for (int i = 1; i <= n; i ++ ) { q[tt ++ ] = i; st[i] = true; } while (hh != tt) .原创 2020-09-15 19:42:27 · 119 阅读 · 0 评论 -
多个起点多个终点的最短路模板
void spfa(){ int scnt; scanf("%d", &scnt); memset(dist, 0x3f, sizeof dist); int hh = 0, tt = 0; while (scnt -- )//从虚拟原点到每一个起点都连一条边 { int u; scanf("%d", &u); dist[u] = 0; q[tt ++ ] = u; .原创 2020-09-15 13:26:16 · 592 阅读 · 0 评论 -
双端队列求最短路模板
bool check(int bound){ memset(dist, 0x3f, sizeof dist); memset(st, 0, sizeof st); q.push_back(1); dist[1] = 0; while (q.size()) { int t = q.front(); q.pop_front(); if (st[t]) continue; st[t] = tr.原创 2020-09-15 08:46:00 · 142 阅读 · 0 评论 -
spfa模板
#include <cstring>#include <iostream>#include <algorithm>#include <queue>using namespace std;const int N=2510,M = 6200 * 2 + 10;int h[N];int dist[N];int e[M];int ne[M];int w[M];int idx;int n,m,S,T;bool st[N];void add(int a,原创 2020-09-14 14:44:32 · 61 阅读 · 0 评论