![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
ACM模板
无
Ember_Sky
这个作者很懒,什么都没留下…
展开
-
模板——字符串最大公共前后缀
字符串最大公共前后缀用KMP时需要用到,一个很巧妙的思想加一个视频讲解(传送门),是KMP的,不过有最大公共前后缀的讲解。const int maxn = 1e5;int g[maxn] = { 0 };//g[i]:前i个字符的最大公共前后缀的长度void gt(string s) {//传入字符串s,更新g数组 int len = s.size(); int i = 0, j =...原创 2019-04-14 17:52:20 · 2435 阅读 · 2 评论 -
模板——最短路径 dijkstra
dijkstra——迪杰斯特拉(最短路径)题目描述每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。再接...原创 2020-05-06 20:14:47 · 223 阅读 · 0 评论 -
模板——最短路径 floyd
floyd——弗洛伊德(最短路径)题目描述每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。再接下一行有...原创 2020-05-06 20:13:37 · 180 阅读 · 0 评论 -
模板——最小生成树 kruskal
kruskal(最小生成树)题目描述第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的N行,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。使任何两个村庄间都可以实现公路交通,但不一定有直接的公路相连,只要能间接通过公路可达即可,输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。co...原创 2020-05-06 20:11:42 · 124 阅读 · 0 评论 -
模板——并差集
并差集_ACM模板题目描述第1行给出两个正整数,分别是城镇数目N (N < 1000 )和道路数目M。随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。要使任何两个城镇间都可以实现交通,但不一定有直接的道路相连,只要互相间接通过道路可达即可,输出最少还需要建设的道路数目?const int maxn = 1010;//N...原创 2020-05-06 20:08:48 · 118 阅读 · 0 评论 -
模板——匈牙利
匈牙利_ACM模板题目描述第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000,1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做。输出:一个整数,表示可以坐上过山车的最多组合数。const int maxn = 505;//N的上限int dp[maxn][maxn];//d...原创 2020-05-06 20:07:47 · 118 阅读 · 0 评论 -
模板——KMP
字符串最大公共前后缀+ KMP(字符串匹配)题目描述给定一个子串s,父串t,返回s在t中出现的次数const int maxn = 1e5;int g[maxn] = { 0 };//g[i]:前i个字符的最大公共前后缀的长度void gt(string s) {//传入字符串s,更新g数组(字符串最大公共前后缀) int len = s.size(); int i = 0, j =...原创 2020-05-06 20:05:45 · 127 阅读 · 0 评论 -
模板——最长回文串 manacher
manacher(最长回文串)_ACM模板题目描述给出一个只由小写英文字符组成的字符串S,求S中最长回文串的长度. 字符串长度len <= 110000。(ababa的回文长度是5)。输出字符串S中所包含的最长回文长度.const int maxn = 300000;//数组长度上限char a[maxn], b[maxn];//原始字符串、新修改后字符串int len[maxn...原创 2020-05-06 20:03:01 · 112 阅读 · 0 评论 -
模板——线段树 区间更新
线段树区间更新_ACM模板题目描述已知一个数列第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。接下来M行每行包含3或4个整数,表示一个操作,具体如下:操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k;操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和?typed...原创 2020-05-06 20:01:25 · 110 阅读 · 0 评论 -
模板——线段树 单点更新
线段树单点更新_ACM模板题目描述第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。学生ID编号分别从1编到N。第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。接下来有M行。每一行有一个字符 C (只取’Q’或’U’) ,和两个正整数A,B。当C为’Q’的时候,表...原创 2020-05-06 19:59:53 · 117 阅读 · 0 评论 -
模板——莫队
莫队ACM模板题目描述第一行,三个整数N、M、K。(M个询问)第二行,N个整数,表示序列,(K>=每个数>=1)。接下来的M行,每个询问给定区间[L,R]求此区间sum(c(1)^2+ c(2)^2+···+ c(K)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L,R]中的个数。输出:M行,每行一个整数,其中第i行的整数表示第i个询问的答案。const in...原创 2020-05-06 19:58:34 · 149 阅读 · 0 评论 -
模板——分块
分块ACM模板题目描述第1行为两个整数N、Q。Q为查询和操作的总和。第2行有N个正整数。第3到第Q+2行每行有一个操作:(1) 若第一个字母为“M”,则紧接着有三个数字L、R、W。表示对闭区间 [L, R] 内所有数加上W。(2) 若第一个字母为“A”,则紧接着有三个数字L、R、C。询问闭区间 [L, R] 内有多少数大于等于C?const int maxn=1e6+10;//N的上...原创 2020-05-06 19:55:29 · 174 阅读 · 0 评论 -
模板——矩阵乘法
矩阵乘法ACM模板题目描述第一行是2个整数 n, m。表示校园内共有n个点,点从0到n-1编号,接着有m行, 每行有两个整数 s, t (0<=s,t<n) 表示从s点能到t点, 注意图是有向的。接着的一行是两个整数T,表示有T组询问(1<=T<=100),接下来的T行, 每行有三个整数 A, B, k, 表示问你从A 点到 B点恰好经过k个点的方案数 (k &l...原创 2020-05-06 19:53:01 · 378 阅读 · 0 评论 -
模板——并差集
并差集模板int father[1003] = { 0 };//标记当前节点的父亲,注意father数组的初始化问题。int depth[1003] = { 0 };//标记当前节点的深度,注意ra数组的初始化问题。int find(int x) {//返回x最上面的父亲 return father[x] = father[x] == x ? x : find(father[x]); /* 如果x的父亲是x,说明已经搜索到头了,返回father[x]就行; 如果x的父亲不是x,就让x的父亲等于原创 2020-09-15 16:51:07 · 75 阅读 · 0 评论 -
模板——快速幂
快速幂模板typedef long long ll;const int mod = 1e9 + 7;ll Pow(ll a, ll b) { ll sum = 1; while (b) { if (b & 1) { sum = (sum * a) % mod; } b /= 2; a = (a * a) % mod; } return sum % mod;}原创 2020-09-15 16:48:03 · 44 阅读 · 0 评论 -
模板——离散化
离散化出自: 大佬详细模板整理vector<int> alls; // 存储所有待离散化的值sort(alls.begin(), alls.end()); // 将所有值排序alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素// 二分求出x对应的离散化的值int find(int x)...原创 2020-05-07 13:22:21 · 128 阅读 · 0 评论 -
模板——差分 前缀和
差分与前缀和出自: 大佬详细模板整理一维前缀和S[i] = a[1] + a[2] + ... a[i]a[l] + ... + a[r] = S[r] - S[l - 1]二维前缀和S[i, j] = 第i行j列格子左上部分所有元素的和以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 -...原创 2020-05-07 12:53:07 · 166 阅读 · 0 评论 -
模板——高精度乘除
高精度乘除低精度整理出自: 大佬详细模板整理高精度乘低精度// C = A * b, A >= 0, b > 0vector<int> mul(vector<int> &A, int b){ vector<int> C; int t = 0; for (int i = 0; i < A.size() ...原创 2020-05-07 11:49:28 · 132 阅读 · 0 评论 -
模板——高精度加减
高精度加减出自: 大佬详细模板整理高精度加法// C = A + B, A >= 0, B >= 0vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<...原创 2020-05-07 11:45:07 · 122 阅读 · 0 评论 -
模板——整数/浮点数二分
整数 / 浮点数二分模板大佬详细题解整数二分bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >>...原创 2020-05-07 11:41:04 · 119 阅读 · 0 评论 -
模板——排列组合优化
排列组合优化正常的排列组合需要n^2的复杂度但是我们可以使用约数和定理将其优化视频讲解const int mod = 1e9 + 7;const int N = 2010;int primes[N], cnt;int num[N];bool st[N];void get_primes(int n) {//素数筛 for (int i = 2; i <= n; i++) ...原创 2020-05-07 11:23:23 · 671 阅读 · 0 评论 -
模板——堆排序
堆排序void push_down(vector <int>& s, int size, int u) { int t = u, l = u * 2, r = u * 2 + 1; if (l <= size && s[l] > s[t])t = l; if (r <= size && s[r] > s[t])t ...原创 2020-05-07 10:30:00 · 109 阅读 · 0 评论 -
模板——归并排序
归并排序void mergesort(vector <int>& s, int l, int r) { if (l >= r) return; int mid = (l + r) >> 1; mergesort(s, l, mid); mergesort(s, mid + 1, r); static vector <int>w; w....原创 2020-05-07 10:29:11 · 102 阅读 · 0 评论 -
模板——快速排序
快速排序从右开始int fin(vector <int>& v, int l, int r) { int t = v[l]; while (l < r) { while (l < r && v[r] > t) r--; v[l] = v[r]; while (l < r && v[l] < t) ...原创 2020-05-07 10:27:13 · 164 阅读 · 0 评论 -
模板——树状数组
树状数组线段树的分支const int maxn = 50010;int tree[maxn], n;inline int lowbit(int x) { return x & (-x);}void add(int x, int val) { for (int i = x; i <= maxn; i += lowbit(i)) tree[i] += val;}...原创 2020-05-06 21:29:36 · 131 阅读 · 0 评论 -
模板——多重背包
多重背包题目描述为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。请问:你用有限的资金最多能采购多少公斤粮食呢?Input输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100...原创 2020-05-06 21:28:34 · 128 阅读 · 0 评论 -
模板——完全背包
完全背包Problem Description不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前.死亡骑士:“我要买道具!”地精商人:“我们这里有三种道具,血瓶150块一个,魔法药200块一个,无敌药水350块一个.”死亡骑士:“好的,给我一个血瓶.说完他掏出那张N元的大钞递给地精商人...原创 2020-05-06 21:27:17 · 146 阅读 · 0 评论 -
模板——01背包
01背包题目描述许多年前,在泰迪的故乡,有一个被称为“骨收集者”的人。这个人喜欢收集各种各样的骨头,比如狗的,牛的,还有他去坟墓的。骨收集器有一个体积很大的V形包,在收集的过程中有很多骨头,显然,不同的骨头有不同的价值和不同的体积,现在根据每次旅行的骨头的价值,你能计算出骨收集器的总价值的最大值吗?输入第一行包含整数T,实例数。其次是T型病例,每例三行,第一行包含两个整数n,v,(n&...原创 2020-05-06 20:55:07 · 237 阅读 · 0 评论 -
模板——网络流 dinic
网络流: dinic题目描述每当农民约翰的田地下雨,池塘就形成在Bessie最喜欢的三叶草补丁上。这意味着三叶草被水覆盖了一段时间,需要相当长的时间才能再生。因此,农民约翰已经建立了一套排水沟,使Bessie的苜蓿补丁从来没有覆盖在水中。取而代之的是,水被排入附近的溪流中。作为一名ACE工程师,农民约翰也在每个沟的开始安装了调节器,所以他可以控制水流到沟里的速率。农场主约翰不仅知道每条沟每分...原创 2020-05-06 20:51:13 · 91 阅读 · 0 评论 -
模板——EK网络流
网络流: EK网络流题目描述每当农民约翰的田地下雨,池塘就形成在Bessie最喜欢的三叶草补丁上。这意味着三叶草被水覆盖了一段时间,需要相当长的时间才能再生。因此,农民约翰已经建立了一套排水沟,使Bessie的苜蓿补丁从来没有覆盖在水中。取而代之的是,水被排入附近的溪流中。作为一名ACE工程师,农民约翰也在每个沟的开始安装了调节器,所以他可以控制水流到沟里的速率。农场主约翰不仅知道每条沟每分...原创 2020-05-06 20:49:43 · 270 阅读 · 0 评论 -
模板——哈夫曼编码
哈夫曼编码问题描述Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当储存空间大于一定的值的时候是不安全的!所以Javac++ 就想是否有一种方式是可以得到字符编码最小的空间值!显然这是可以的,因为书上有这一块内容–哈夫曼编码(Huffman Coding);一个字母的权值等于该字母在字...原创 2020-05-06 20:21:27 · 236 阅读 · 0 评论 -
模板——状态压缩dp
状态压缩dp问题描述给定一张 n个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数n。接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[...原创 2020-05-06 20:19:55 · 224 阅读 · 0 评论 -
模板——最短路径 SPFA
SPFA(最短路径)题目描述每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。再接下一行有两个整数S,T...原创 2020-05-06 20:18:19 · 246 阅读 · 0 评论