算法模板
正月看飞雪
这个作者很懒,什么都没留下…
展开
-
算法模板
1. 基本算法快速排序&归并排序模板二分C++高精度运算前缀与差分双指针算法离散化原创 2020-02-17 12:03:54 · 369 阅读 · 2 评论 -
线段树模板 单点修改 区间修改 区间加 & 区间乘
线段树维护数组arr[] = {1,3,5,7,9,11},的区间和。每一个节点的左右孩子等于2*node + 1和 2 * 弄得+ 2;#include<bits/stdc++.h>using namespace std;const int N = 1000;void build_tree(int arr[], int tree[], int node, int st...原创 2019-12-01 16:05:45 · 317 阅读 · 0 评论 -
Kruskal算法 走廊泼水节 CH6201
问题描述给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。求增加的边的权值总和最小是多少。注意: 树中的所有边权均为整数,且新加的所有边权也必须为整数。输入格式第一行包含整数t,表示共有t组测试数据。对于每组测试数据,第一行包含整数N。接下来N-1行,每行三个整数X,Y,Z,表示X节点与Y节点之间存在一条边,长度为Z。输出格式每...原创 2020-03-09 16:00:30 · 199 阅读 · 0 评论 -
博弈论【sg函数】
SG函数定义:给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负。事实上,这个游戏可以认为是所有公平组合游戏的抽象模型。在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,…yk, 定义SG(x)为x的后继节点y1,y2,…yk的SG函数值构成的集合再执行mex运算的结果,即SG(x) =mex({SG...原创 2020-01-17 14:01:42 · 680 阅读 · 0 评论 -
Catalan数列
因为这里的模数是素数,所以可以用费马小定理, 如果不是,就要用扩展欧几里得#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;typedef long long ll;const int mod = ...原创 2020-02-23 16:36:15 · 793 阅读 · 0 评论 -
组合计数 (四)1.递归 2. 快速幂求逆元 3.卢卡斯定理 4.阶乘分解加大数据乘法运算
a,b较小时 2000#include<iostream>using namespace std;const int N = 2010, mod = 1e9 + 7;int c[N][N];int n;int main(){ cin >> n; for(int i = 0; i < N; i++) { for(...原创 2020-02-23 16:06:41 · 2248 阅读 · 0 评论 -
快速幂 & 求乘法逆元
快速幂求a^b%c#include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;int n, a, b, c;ll quick_mul(int a, int b, int c){ ll ans = 1 %...原创 2020-02-22 14:14:35 · 368 阅读 · 0 评论 -
数论:欧几里得算法;欧几里得扩展式;欧拉函数, 欧拉筛选;积性函数;费马小定理;欧拉定理;欧拉定理的推论;线性同余方程;中国剩余定理
欧几里得算法 对任意整数a, b 并且 b不等于0, 有 gcd(a, b) = gcd(b, a % b)代码int gcd(int a, int b){ return b ? gcd(b, a % b) : a;}朴素写法int gcd(int a, int b){ if(b == 0)...原创 2020-02-03 16:19:35 · 567 阅读 · 0 评论 -
求约数之和
一个数 N 的约数个数:设 N = p1^a1 * p2 ^ a2 * p3 ^ a3 … pn ^ an;约数个数 sum = (a1 + 1) * (a2 + 1) * ***** ( an + 1).约数之和: (p1^0 + p1 ^ 1 + … p1^a1) * (p2^0 + p2 ^ 1 + …p2^a2) …求几个数的乘积的约数之和#include <iostrea...原创 2020-02-21 18:45:21 · 634 阅读 · 0 评论 -
求约数个数
一个数 N 的约数个数:设 N = p1^a1 * p2 ^ a2 * p3 ^ a3 … pn ^ an;约数个数 sum = (a1 + 1) * (a2 + 1) * ***** ( an + 1).求几个数乘积的约数个数#include <iostream>#include <cstring>#include <unordered_map&...原创 2020-02-21 18:32:09 · 440 阅读 · 0 评论 -
分解质因数
#include <algorithm>#include <cstring>#include <iostream>using namespace std;int n;bool check(int n){ for (int i = 2; i <= n / i; i++) { int s = 0; ...原创 2020-02-21 15:07:05 · 246 阅读 · 0 评论 -
染色法判定二分图 & 匈牙利算法
匈牙利#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int N = 510, M = 100010;int ne[M], e[M], h[M], match[N];int len, n1, n2, m;bool vis[N];...原创 2020-02-20 19:56:47 · 301 阅读 · 0 评论 -
prim & kruskal
prim#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 510, inf = 0x3f3f3f3f;int g[N][N], dis[N];int n, m;bool vis[N];void prim(){...原创 2020-02-20 18:16:52 · 186 阅读 · 0 评论 -
bellman-ford & SPFA
bellman-ford 求限定走k条边的最短路#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 510, M = 10010;struct node{ int x, y, z;} e[M];int n...原创 2020-02-20 13:17:50 · 174 阅读 · 0 评论 -
dijkstra & floyd
朴素版dijkstra O(n^2)#include <algorithm>#include <cstring>#include <iostream>using namespace std;const int N = 510;int g[N][N], dis[N];int n, m;bool vis[N];void dijkstra(in...原创 2020-02-20 12:19:50 · 204 阅读 · 0 评论 -
拓扑排序
#include <iostream>#include <algorithm>#include <cstring>#include <queue>using namespace std;const int N = 1e5 + 10 ;int deg[N], ne[N], e[N], h[N];int n, len, m, a[N], c...原创 2020-02-19 18:33:21 · 183 阅读 · 0 评论 -
树的重心 & 连通图的划分
树的重心树的重心的定义:去掉这个点后,剩下的子树中节点最多的那棵树,的节点最少,那么这棵树,就是树的重心const int N = 2e5 + 10;int e[N], ne[N], h[N], len;int n, ans, cnt[N];bool vis[N];int pos;void dfs(int u){ vis[u] = true, cnt[u] = 1; //子树...原创 2020-02-19 18:18:07 · 289 阅读 · 0 评论 -
Hash表&字符串Hash
1.链式存Hash表,用邻接表存 拉链法const int N = 1e5 + 10, mod = 100003;int h[N], ne[N], e[N], len, n, x;void add(int x){ int head = ((x % mod) + mod) % mod; e[len] = x; ne[len] = h[head]; h[head] = len++;...原创 2020-02-18 18:08:43 · 244 阅读 · 0 评论 -
并查集
普通并查集void init(int n){ for (int i = 0; i <= n; i++) { p[i] = i; }}int find(int x){ if (p[x] == x) return x; return p[x] = find(p[x]);}void unite(int x, int y){ x = find(x); y...原创 2020-02-18 16:05:37 · 142 阅读 · 0 评论 -
Trie
插入和查询操作,cnt记录字符串出现多少次int trie[N][26], len;int cnt[N];void insert(char *s){ int p = 0; for (int i = 0; s[i]; i++) { int ch = s[i] - 'a'; if (trie[p][ch] == 0) trie[p][ch] = ++len; p = t...原创 2020-02-18 13:15:18 · 138 阅读 · 0 评论 -
KMP
KMP Next[1] = 0;//p是模式串 s是长串 for(int i = 2, j = 0; i <= n; i++){ while(j && p[i] != p[j + 1]) j = Next[j]; if(p[i] == p[j + 1]) j++; Next[i] = j; } ...原创 2020-02-17 15:31:49 · 217 阅读 · 0 评论 -
单调栈&单调队列
1.单调栈 len = 0, a[N]; for(int i = 1; i <= n; i++) { while(len && check(s[len], a[i])) len--; s[++len] = a; }2.单调队列滑动窗口#include<iostream>using namespac...原创 2020-02-17 14:43:28 · 134 阅读 · 0 评论 -
链表&邻接表
单链表int ne[N], head, e[N], len;void init(){ head = -1, len = 0;}void add_head(int x){ e[len] = x; ne[len] = head; head = len++;}void add(int k, int x){ e[len] = x; ne[l...原创 2020-02-17 14:07:22 · 215 阅读 · 0 评论 -
离散化
模板P里面存需要离散化的数值,find函数返回离散化以后的值,还需要一个容器存离散化以前的值,然后离散化完以后调用find把离散化的数值存起来。int find(int x){ return lower_bound(p.begin(), p.end(), x) - p.begin();}int main(){ sort(p.begin(), p.end()); ...原创 2020-02-17 11:20:32 · 148 阅读 · 0 评论 -
双指针算法
1.双指针算法的通用模板for(int i = 0, j = 0; i < n; i++){ while(check(i, j) j++; //具体操作}2.双指针算法求单词数输入abc ab aaa输出abcabaaastring s;int main(){ getline(cin, s); for(int i = 0; i < s.siz...原创 2020-02-16 15:18:11 · 187 阅读 · 0 评论 -
前缀与差分
1.一维前缀和 for(int i = 1; i <= n; i++){ scanf("%d", a + i); s[i] = s[i - 1] + a[i]; } //求x到y这个区间的和 while(m--){ int x, y; cin >> x >> y; ...原创 2020-02-16 13:49:28 · 165 阅读 · 0 评论 -
C++高精度运算
加法vector<int> add(vector<int> &A, vector<int> &B){ vector<int> C; int t = 0; for(int i = 0; i < A.size() || i < B.size(); i++) { ...原创 2020-02-15 21:27:49 · 478 阅读 · 0 评论 -
二分算法
1.在单调递增序列中查找 >= x的第一个数 while(l < r){ int mid = (l + r) >> 1; if(a[i] >= x) r = mid; else l = mid + 1; } ans = a[l];2.在单调递增序列中查找 <= x的第一个数 wh...原创 2020-02-15 19:20:31 · 219 阅读 · 0 评论 -
快速排序&归并排序模板&堆排序
快速排序void quick_sort(int *a, int l, int r){ if(l >= r) return; int x = a[(l + r) >> 1]; int i = l - 1, j = r + 1; while(i < j) { do i++; while(a[i] < ...原创 2020-02-15 16:58:42 · 290 阅读 · 0 评论