
算法模板
文章平均质量分 56
本人整理的算法代码模板
常欢愉皆胜意且顺遂
记得一定要努力,不然往后余生,做饭是你,洗衣是你,做家务是你……是你是你还是你
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
超有爱的并查集~(转载)
此文章是我初学并查集时看的一篇文章,感觉写的非常好,但是原文链接好像已经打不开了作者:飘过的小牛原文:https://blog.csdn.net/niushuai666/article/details/6662911例子就是杭电上的畅通工程:http://acm.hdu.edu.cn/showproblem.php?pid=1232首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通转载 2021-11-21 18:41:32 · 129 阅读 · 0 评论 -
快速排序简介及代码模板
快速排序是对冒泡排序的改进,基本思想是基于分治法来减少交换次数# 基本步骤1、先找一个基准元素,通常是第一个元素2、将小于基准元素的数都移动到它的左边,大于基准元素的数都移动到它的右边。此时,基准元素位于它最终的位置3、对基准元素左右两个分块重复以上的步骤,直到全部有序。# 时间复杂度如果每次能够将数组划分为两个区间,总共需要进行 logn 趟排序,所以平均复杂度为 O(nlogn)。# 空间复杂度因为快速排序是递归的形式,如果每次能够将数组划分为两个区间,会递归 logn 层,此时平均复杂度为O(log原创 2020-07-17 09:54:46 · 234 阅读 · 0 评论 -
Java大数类运算
心血来潮想写一下高精度,结果发现不会写 QAQ这个… 还是用Java吧import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] arg) { Scanner in = new Scanner(System.in); BigInteger a, b; a = in.nextBigInteger(); b = in.nextBigI原创 2021-03-07 20:24:02 · 166 阅读 · 1 评论 -
蛇形填数(C语言)
文章目录蛇形填数DescriptionInputOutputSample InputSample Output蛇形矩阵题目描述输入描述输出描述样例输入样例输出蛇形填数Description在n*n方陈里填入1,2,…,n*n,要求填成蛇形。例如n=4时方陈为:10 11 12 19 16 13 28 15 14 37 6 5 4Input直接输入方陈的维数,即n的值。(n<...原创 2019-08-17 21:21:27 · 1183 阅读 · 0 评论 -
关押罪犯(扩展域并查集)
扩展域并查集(不会二分图 QAQ)我们先按照两个人之间的仇恨从大到小排序,先解决大的仇恨,直到有仇恨无法解决,这样使得发生的冲突尽可能小因为一个罪犯有朋友和仇人,需要开2倍大小的并查集,表示朋友域和仇人域如果a和b是仇人,那么就进行:1)合并a和b的仇人域(表示a和b的仇人是朋友,关入同一个监狱)2)合并a的仇人域和b(表示a的仇人和b是朋友,关入同一个监狱)#include <bits/stdc++.h>using namespace std;const int N = 4..原创 2021-01-24 20:08:25 · 367 阅读 · 0 评论 -
线段树的例题
文章目录影子的宽度区间平方和问题:区间开根号问题stars逆序对影子的宽度题目描述桌子上零散地放着若干个盒子,盒子都平行于墙。桌子的后方是一堵墙。如图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?输入第1行:3个整数L,R,N。-100000 <=L<=R<= 100000,表示墙所在的区间;1<=N<=100000,表示盒子的个数接下来N行,每行2个整数BL, BR,-100000 <=BL<=BR<=原创 2020-11-29 16:26:47 · 410 阅读 · 0 评论 -
主席树简介及代码模板
主席树全称是可持久化权值线段树,通常用来解决区间第 k 小的问题。可持久化数据结构 (Persistent data structure) 总是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。权值线段树是记录每个权值出现次数的一种线段树。为什么要使用主席树?如果我们要求区间第 k 小的数,如果暴力一点,可以每插入一次开一棵线段树,但是空间一定会爆掉。所以要使用主席树,在原有空间的基础上,进行插入。原创 2020-10-28 11:10:53 · 648 阅读 · 0 评论 -
线段树简介及代码模板
树状数组可以在 O(logn) 的时间复杂度内实现单点修改、区间查询。相对于树状数组,线段树更加通用,代码更长,功能也更加强大。线段树是一种基于分治思想的二叉树结构,用于在区间上进行信息统计。线段树可以在 O(logn) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。线段树的一些性质:1、每个节点都代表一个区间2、根节点代表的区间是整个统计范围,如 [1, N]3、线段树的每个叶节点都代表长度为 1 的元区间 [x, x]4、对于每个内部节点原创 2020-10-13 20:57:20 · 645 阅读 · 0 评论 -
单调栈简介及代码模板
单调栈简介单调栈,栈内的元素要从小到大,或者从大到小如果一个栈是单调递增的,要求从栈顶到栈底单调递增:当要进栈的元素 x 大于栈顶元素时,需要先弹出所有比 x 小的元素,再将 x 压入栈当要进栈的元素 x 小于栈顶元素时,直接将 x 压入栈while (stk.size() && x > stk.top()) { stk.pop();}stk.push(x);P5788 【模板】单调栈题目链接:https://www.luogu.com.cn/problem/P5原创 2020-10-04 10:35:15 · 385 阅读 · 0 评论 -
带权并查集简介及代码模板
简介:并查集实际上是由若干课树构成的森林,我们可以在树中的每条边上记录一个权值,即维护一个数组 d,用 d[x] 保存节点 x 到父节点 fa[x] 之间的边权。在每次路径压缩后,每个访问过的节点都会直接指向树根,如果我们同时更新这些节点的 d 值,就可以利用路径压缩过程来统计每个节点到树根之间的路径上的一些信息。这就是所谓的“边带权”的并查集。——摘录自蓝书初始化操作:void init(int n){ for (int i = 1; i <= n; i++) { fa[i] = i原创 2020-09-30 16:35:05 · 314 阅读 · 0 评论 -
树状数组简介及代码模板
树状数组是一种基于二进制来将区间 [1, x] 分成 logx 个小区间的数据结构,其基本用途是维护序列的前缀和。基本操作1、lowbit,返回x的二进制数下最小2的次幂2、ask,查询前缀和3、add,单点修改lowbit 操作:lowbit(x):返回x的二进制数下最小2的次幂例如:因为7 = 0111,所以lowbit(7) = 1因为6 = 0110,所以lowbit(6) = 2因为4 = 0100,所以lowbit(4) = 4int lowbit(int x){ re原创 2020-09-30 08:33:54 · 550 阅读 · 0 评论 -
ACM中freopen的使用
百度百科上的定义:freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。用途一:输入重定向。当调试代码时,可以将测试数据存在 in.txt 文件中,用freopen读取测试:写出下面的代码#include <cstdio>#include <iostream>using namespace std;int main(void){原创 2020-08-11 19:50:31 · 552 阅读 · 0 评论 -
最小生成树算法简介及代码模板
prim算法每次取未使用的、距离最小生成树最近的点1、vis数组:存储每个已经加入最小生成树的点,dis数组:表示最小生成树到剩下的所有点的最小距离。2、先在图中找到第一个点v1,放入最小生成树。更新数组dis,为v1到剩余所有点的距离(dis[i] = ma[1][i])。3、再从剩余的点中找到距离最小生成树最近的点v’,将其放入最小生成树,更新数组vis,并更新dis的值(dis[i] = min(dis[i], ma[i][v’]))。4、以此类推,直到最后所有的点均放入最下生成树,此时就求原创 2020-07-16 11:13:45 · 477 阅读 · 0 评论 -
C++重载运算符
C++ 允许编写者为名称相同的函数或者运算符指定不同的定义。这称为重载(overload)。#include <bits/stdc++.h>using namespace std;struct Point{ int x, y; // 向量加 Point operator + (const Point &b) const { Point c; c.x = x + b.x; c.y = y + b.y; return c; } // 向量减 Point原创 2020-07-16 19:39:48 · 244 阅读 · 0 评论 -
最大公约数和最小公倍数
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数用最初的两个数的乘积再处以最大公约数就可得到最小公倍数...原创 2020-07-06 14:34:24 · 606 阅读 · 0 评论 -
hdu1874:畅通工程续(单源最短路模板)
作者:血小板自动机链接:https://blog.dalao.icu/archives/8.html题目传送门hdu1874:畅通工程续解题思路这题因为数据量比较小,可以使用多种最短路算法来解决,是一道经典的模板题,下面附上 floyd 算法、dijkstra 算法、Bellman-Ford 、spfa 算法、以及 dijkstra + heap 优化的代码。坑点:这题可能一个城市到另一个城市有多条路径,我们记录的时候,要记录最小的那条路径,不能记录最后的那条路径,解其他题目的时转载 2020-06-24 12:36:25 · 365 阅读 · 0 评论 -
暴力枚举、搜索、动态规划
四种面值的货币:1, 5, 10, 25,每种均有无数张可用,给定一个整数aim表示要凑齐的金额,计算有多少种方法可以凑齐?可以看出,上面的题目是一个完全背包问题,我们尝试用五种方法来对它进行求解,来体会不同方法的差异,了解动态规划的推导暴力枚举方法#include <iostream>using namespace std;int v[] = {1, 5, 10, 25};int main(void){ int res = 0, aim;原创 2020-06-07 19:29:41 · 2574 阅读 · 0 评论 -
A - 敌兵布阵
Problem DescriptionC国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。中...原创 2020-02-12 15:26:41 · 327 阅读 · 0 评论 -
字符串编辑(动态规划)
给定两个字符串 str1str1str1 和 str2str2str2,再给定三个整数 icicic、dcdcdc、和 rcrcrc 分别代表插入、删除和替换一个字符的代价。返回将 str1str1str1 编辑成 str2str2str2 的最小代价。比如,str1=“abc”str1=“abc”str1=“abc”,str2=“adc”str2=“adc”str2=“adc”,ic=5ic=5ic=5,dc=3dc=3dc=3,rc=2rc=2rc=2。把 bbb 替换成 ddd 是代价最小的,所以返原创 2020-06-08 21:25:26 · 825 阅读 · 0 评论 -
二分算法简介及代码模板
二分算法的思想是:有一个原始的区间,每次取中点进行判断,并删去区间的一半,直到区间的左右端点相等,此时区间的左右端点即为答案二分算法常用来求解**具有单调性**的问题,比如:①在原始区间中,左边一段满足条件,右边一段不满足条件,可以利用二分算法来求解满足条件的最大值②在原始区间中,左边一段不满足条件,右边一段满足条件,可以利用二分算法来求解满足条件的最小值可以计算出它的时间复杂度为 O(logn),是一种很高效的算法原创 2020-04-04 12:22:43 · 692 阅读 · 2 评论 -
dfs模板
需要注意,state == t 一定要放在最前面#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int a[25];void dfs(int u, int state){ if (state == t){//达到某种条件 ...原创 2020-03-15 16:13:37 · 158 阅读 · 0 评论 -
迷宫城堡(tarjan算法)
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,...原创 2020-03-14 15:22:02 · 383 阅读 · 0 评论 -
曹冲养猪(中国剩余定理)
链接:https://ac.nowcoder.com/acm/problem/50569来源:牛客网题目描述自从曹冲搞定了大象以后,曹操就开始琢磨让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲很不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。 举个例子,假如有16头母猪,如果建了3个猪圈,剩下1头猪就没有地方安家了;如果建造了5个猪圈,但是仍然有1头猪...原创 2020-02-18 17:04:21 · 821 阅读 · 1 评论 -
求解乘法逆元的方法
求解乘法逆元有三种常用方法:1、费马小定理/欧拉函数2、扩展欧几里德算法3、线性求逆元取模公式(a+b) mod p=(a mod p+b mod p) mod p(a+b)~mod~p=(a~mod~p+b~mod~p)~mod~p(a+b) mod p=(a mod ...原创 2020-02-10 22:09:42 · 4485 阅读 · 0 评论 -
矩阵快速幂模板
50579 Fibonacci 第 n 项题目链接:https://ac.nowcoder.com/acm/problem/50579#include <cstdio>#include <iostream>#include <vector>using namespace std;typedef long long ll;typedef vecto...原创 2020-02-09 18:34:01 · 207 阅读 · 0 评论 -
容斥原理模板
题目链接:https://ac.nowcoder.com/acm/problem/14686来源:牛客网集合中的质数题目描述给出一个集合和一个数m。 集合里面有n个质数。 请你求出从 1 到 m 的所有数中,至少能被集合中的一个数整除的数的个数。输入描述:第一行两个正整数 n 和 m 。第二行n个正整数,分别为集合中的质数。输出描述:输出一个整数,表示符合要求的正整数的...原创 2020-02-09 17:36:49 · 330 阅读 · 0 评论 -
尺取法模板
尺取法,也叫双指针,是一种O(n)复杂度的算法,通过调整区间的左右端点,来找到满足要求的区间@[tocSubsequenceDescriptionA sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to f...原创 2019-05-03 15:58:24 · 286 阅读 · 0 评论 -
图的存储(邻接矩阵、邻接表和链式向前星)
图的表示邻接矩阵邻接矩阵使用n×nn \times nn×n的二维矩阵来表示图。用g[i][j]g[i][j]g[i][j]来表示点iii和点jjj的关系,可以是0、10、10、1来表示两点是否可达,也可以是数字来表示两点间的距离。邻接表邻接表是表示点iii可到达的点,可以用动态数组来进行存储。如果要存储带权图,可以将边用结构体来表示。#include <cstdio>#inclu...原创 2020-02-01 23:58:49 · 582 阅读 · 0 评论 -
快速读入模板
关于快速读入:https://www.cnblogs.com/newbiePWang/p/10192655.html#include <cstdio>using namespace std;inline int read(){ int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch >...原创 2020-01-30 17:04:34 · 297 阅读 · 0 评论 -
字典树(Trie)模板
字典树是一种用于字符串快速索引的树结构。字典树最基础的应用——查找一个字符串是否在“字典”中出现过。#include <iostream>#include <cstring>using namespace std;const int N = 1e6 + 5;int trie[N][26], tot = 1;//初始化 bool exist[N];//以该结点结尾的字符串是否存在char str[N];void i...原创 2020-01-27 17:41:59 · 338 阅读 · 0 评论 -
拓扑排序算法(kahn、dfs)
#include <cstdio>#include <cstring>#include <queue> using namespace std;const int N = 2005;int t, n, m;int in[N]; //每个节点的度 queue<int> q;vector<int> edge[N], ans;...原创 2020-01-12 21:25:31 · 422 阅读 · 0 评论 -
分解质因数算法和欧拉函数
分解质因数的含义:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。#include <cstdio>#include <iostream>using namespace std;int main(void){ int n; cin >...原创 2019-11-24 16:05:28 · 780 阅读 · 0 评论 -
辗转相除法(gcd、exgcd)
用于求两个数的最大公约数。复杂度在O(log(max(a,b)))O(log(max(a,b)))O(log(max(a,b)))以内。#include <cstdio>#include <iostream>using namespace std;int gcd(int a, int b){ if (b == 0) return a; return gcd(...原创 2019-11-24 14:50:23 · 406 阅读 · 0 评论 -
64位整数乘法、快速幂和次方求模
快速幂#include <cstdio>#include <iostream>using namespace std;typedef long long ll;ll pow(ll x, ll n){ ll res = 1; while (n > 0){ if (n & 1) res = res * x;//如果为1,则乘上x^(2^i)...原创 2019-11-24 14:26:06 · 772 阅读 · 0 评论 -
素数筛法(埃氏筛法、欧拉筛法)
# 埃氏筛法 埃氏筛法可以求出n以内的所有素数,并返回素数个数,复杂度为$O(nloglogn)$。O(nloglogn)O(nloglogn)O(nloglogn)。#include <cstdio>#include <iostream>using namespace std;const int N = 1e5 + 5;int prime[N];bool is_prime[N];int sieve(int n){...原创 2019-11-16 23:38:47 · 399 阅读 · 0 评论 -
Dijkstra算法图文详解(转)
本文转载自:https://blog.csdn.net/lbperfect123/article/details/84281300Dijkstra算法Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其...转载 2019-12-08 20:56:15 · 6638 阅读 · 0 评论 -
Floyd-傻子也能看懂的弗洛伊德算法(转)
暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。现在需要一个数据结构来存储图的信息,...转载 2019-03-21 20:20:09 · 622 阅读 · 0 评论 -
并查集简介及代码模板
#include <cstdio>#include <cstring>const int N = 5e4;int bcj[N + 5];//记录每个节点的父节点void init(int n)//n棵有一个节点的树 { for (int i = 1; i <= n; i++) bcj[i] = i;}int find(int x)//找到此节...原创 2020-01-12 19:03:57 · 524 阅读 · 0 评论 -
Manacher算法模板
题目二 Manacher算法详解与应用1.复杂度:O(N)2.概念:回文直径:以i为中心,两边能够扩展到的回文半径:以i为中心,一边能够扩展到的1)回文半径数组(arr)记录每个位置的回文半径2)最右回文右边界®表示到目前为止在向右扩展时,能到达的最右边的位置。初始为-13)回文右边界的中心©表示第一次到达此右边界的位置3.马拉车算法的扩展情况(有两种可能性,分成了4种情况,...原创 2019-07-10 17:50:54 · 301 阅读 · 0 评论 -
KMP面试题
# 一道例题(京东2018测试开发工程师笔试编程题)## 题目描述:给定一个字符串s,请计算输出含有连续两个s作为子串的最短字符串。注意两个s可能有重叠部分。例如,"ababa"含有两个"aba"。## 输入描述:输入包括一个字符串s,字符串长度length(1 ≤ length ≤ 50),s中每个字符都是小写字母。## 输出描述:输出一个字符串,即含有连续两个s作为子串的最短字符串。原创 2019-07-09 16:44:47 · 435 阅读 · 1 评论