模板
文章平均质量分 56
moomhxy
你若是天才,我便是疯子
展开
-
BFS与DFS模板
搜索问题的解法DFS(深度优先搜索) BFS(广度优先搜索) backtracking(回溯)DFS模板void dfs(...) { // 结束递归的条件 if (...) { ..... // 把“当前结果” 加入 “结果集容器” 中 return; } // 继续递归,里面可能有回溯,也可能没有 if...转载 2018-08-13 18:37:18 · 412 阅读 · 1 评论 -
矩阵快速幂及斐波那契数列模板
本篇博客先给出矩阵快速幂以及利用矩阵快速幂求斐波那契数列的模板,讲解待更新…… const int N=10;int tmp[N][N];void multi(int a[][N],int b[][N],int n){ memset(tmp,0,sizeof tmp); for(int i=0;i<n;i++) for(int j=0;j<n...原创 2018-10-20 10:14:31 · 914 阅读 · 0 评论 -
高精度计算大数模板
更新:高效大数模板#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<math.h>#include<set>#include<queue&原创 2018-11-01 13:24:37 · 304 阅读 · 0 评论 -
最短路算法
本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法1),深度或广度优先搜索算法(解决单源最短路径)从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径。下面是核心代码:void dfs(int cur, int dst){ /***oper...转载 2018-11-01 14:25:40 · 585 阅读 · 0 评论 -
并查集
性质并查集算法(union_find sets)不支持分割一个集合,求连通子图、求最小生成树初始化我们将每一个结点的前导结点设置为自己,如果在join函数时未能形成连通,将独立成点for(int i=0;i<n;i++)//n表示输入的结点的个数{ pre[i]=i;//将每一个结点的前导点设置为自己}用法并查集是由一个数组pre[],和两个函数构成的...原创 2018-11-06 17:19:05 · 635 阅读 · 0 评论 -
树状数组入门
前言 最近初学树状数组,原理还不是太理解,等自己什么时候完全理解了再自己总结一番。掌握树状数组~彻底入门先贴一下树状数组的模板代码:int lowbit(int i){ return i & -i;//或者是return i-(i&(i-1));表示求数组下标二进制的非0最低位所表示的值}void update(int i,int va...转载 2018-11-05 11:11:57 · 214 阅读 · 0 评论 -
NOIP / ACM 选手必知的编程技巧及常用C++头文件模板
前言 平时做题或者比赛掌握一些有用的技巧会方便我们调试,使程序可读性更强,另外模板也比较省时,所以我就从网上整理了一下。 重载运算符重载运算符是通过对运算符的重新定义,使得其支持特定数据类型的运算操作。有的时候,我们构造了一种新的数据类型(高精度数,矩阵),当然可以将数据类型的运算操作用函数的形式写出来。但采用重载运算符的方式,可以让程序更为自然。当然,重载运算符...原创 2018-11-19 10:53:45 · 1872 阅读 · 0 评论 -
线段树模板
线段树 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间...原创 2018-11-18 10:27:07 · 215 阅读 · 0 评论 -
01背包,完全背包,多重背包,分组背包模板
一:01背包有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。关键是找出状态方程组,可知为dp[i][j]=max(dp[i-1][ j ],dp[i-1][j-w[i] ]+c[i]),所以可以写出代码#include <iostream>#include<...原创 2018-12-05 15:11:44 · 248 阅读 · 0 评论 -
欧拉函数模板
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。 筛法欧拉函数const int N = 100005;int euler[N + 10];void Geteuler(){ me...原创 2018-12-06 19:59:28 · 115 阅读 · 0 评论 -
莫比乌斯反演
定义莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数)。具体定义如下:如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。如果一个数不包含平方因子,并且有k个不同的质因子,那么m...原创 2018-12-06 21:09:59 · 173 阅读 · 0 评论 -
最短路之Dijkstra算法模板
复杂度n2,点编号从0到n-1,要对lowcost数组初始化inf , 注意结点编号const int inf = 0x3f3f3f3f;const int maxn = 7e3 + 10;bool vis[maxn];int pre[maxn], lowcost[maxn];int cost[maxn][maxn];void dijkstra(int n, int beg){...原创 2019-03-13 17:01:56 · 212 阅读 · 0 评论 -
C++读入输出优化【附模板(全)】
关闭同步、解除绑定ios::sync_with_stdio(false);注意:在使用后进行io操作时不能同时使用cin 与scanf。另外可以进一步加快执行效率。ios::sync_with_stdio(false);cin.tie(0);读入整数int read(){ int x = 0, w = 1; char ch = 0; ...原创 2019-04-19 13:46:24 · 1068 阅读 · 0 评论 -
字典树模板
版本一:B站视频教程:链接const int tn = 26; //分叉,字符个数struct node{ int flag; node *nxt[tn]; node() { for(int i = 0; i < tn; ++i) nxt[i] = NULL; flag = 0; }...原创 2019-05-19 15:17:37 · 138 阅读 · 0 评论 -
线性基模板
插入void ins(ll x) //插入{ for(int i = 62; i >= 0; --i) { if(x & (1ll << i)) { if(!p[i]) { p[i] = x; break; } ...原创 2019-07-26 21:07:05 · 153 阅读 · 0 评论 -
最小生成树之Kruskal算法
Kruskal算法的高效实现需要一种称作并查集的结构。我们在这里步介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论。 Kruskal算法的过程: (1) 将全部边按照权值由小到大排序。(2) 按顺序(边权由小到大的顺序)考虑每条边,只要这条边和我们已经选择的边不构成圈,就保留这条边,否则放弃这条边。算法 成功选择(n-1)条边后,形成一个棵最小生成树,当然如果...原创 2018-10-22 16:53:05 · 330 阅读 · 0 评论 -
AC自动机模板
算法简述ac自动机是一类在字典树上进行kmp的算法。学习ac自动机一般考点都在于对字典树上的点做处理,一般考的都是在自动机上的dp,而这类的dp中几乎必定有一维表示的是自动机上的点。模板#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>...原创 2018-10-22 16:16:15 · 103 阅读 · 0 评论 -
完全背包优化及模板
题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。思路:与01背包不同的是一个物品可以选无穷个,写出递推关系:dp[ 0 ] [ j ] =0,dp[ i+1 ] [ j ]=max{ dp[ i-k*w[i] ]+k*v[i] }(k>=0)...原创 2018-10-16 23:06:47 · 1085 阅读 · 0 评论 -
KMP算法(推导方法及模板)
介绍 克努斯-莫里斯-普拉特算法Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。 此算法可以在O(n+m)时间数量级上完成串的模式匹配操作,其改进在于:每当一趟匹配过程中...原创 2018-08-09 13:06:24 · 1087 阅读 · 0 评论 -
动态规划模板总结
动态规划:通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。试用情况:最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。 无后效性。即子问题的解一旦确定,就不再...原创 2018-08-06 17:06:47 · 4843 阅读 · 0 评论 -
快速幂取模算法
在算法程序设计竞赛中,会经常碰到对某个数N进行求大数次幂并对1e9+7取模的运算的题目,一方面求大数次幂是一个时间复杂度很高的运算(容易超时),另一方面对1e9+7取模,暗示着结果是连long long都存不下(同余定理),所以这时候快速幂取模算法就派上用场了,我们先来求a^bmodc;算法1:直接设计,朴素int ans = 1;for(int i = 1;i<=b;i++)...原创 2018-07-20 14:56:32 · 1005 阅读 · 1 评论 -
sort函数用法详解
用于C++中,对给定区间所有元素进行排序。头文件是#include <algorithm>sort函数进行快速排序,时间复杂度为n*log2n,比冒泡之类的要省时不少Sort函数使用模板:Sort(start,end,排序方法)1.第一个参数是要排序数组的起始地址2.第二个参数是数组结束地址的下一位3.第三个是排序的方法,可不填,默认升序一般是直接对数组进行...原创 2018-07-20 11:34:14 · 26490 阅读 · 0 评论 -
中国剩余定理(孙子定理)
中国剩余定理(CRT)的表述如下 注:需先了解扩展欧几里得与乘法逆元,链接点击打开链接 设正整数两两互素,则同余方程组 设M=∏ni=1mi,Mi=M/mi,Miti≡1(mod mi)则方程组的通解形式即为:x=∑ni=1aiMiti在模M意义下只有一个解:x=(∑ni=1aiM...转载 2018-07-19 11:38:22 · 843 阅读 · 0 评论 -
扩展欧几里得定理
扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。设 a>b。1,显然当 b=0,gcd...原创 2018-07-19 10:01:07 · 3002 阅读 · 0 评论 -
斯特林公式--取N阶乘近似值
斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。 公式为: 其中pi=3.1415926 ...原创 2018-07-16 18:22:44 · 1498 阅读 · 0 评论 -
二分查找法(STL)详解
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步...原创 2018-07-03 23:09:22 · 1087 阅读 · 0 评论 -
康托展开与逆康托展开
康托展开原理:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[1]*0! 0<=a[i]<i(1<=i<=n)这就是康托展开的公式,其中a[i]为当前未出现的元素中是排在第几个(从0开始)。应用:康托展开一般应用于寻找全排列数在其排列中的位置。例如{1,2,3}的全排列从小到大为123,132,213,231,312,321我...原创 2018-07-03 09:56:29 · 491 阅读 · 0 评论 -
筛法求素数
... 一般求素数都是暴力求解,这样效率不高,今天就总结一下筛法求素数,这是一种较高效的算法,具体如下:用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛...原创 2018-06-09 15:07:26 · 5445 阅读 · 0 评论 -
辗转相除法求最大公约数与最小公倍数
非常简单的一个小代码,想起初学时看半天没懂,今天遇到了就总结了一下,看代码:#include<stdio.h>int main(){ int a,b,c,d,t,max,min; scanf("%d%d",&a,&b); if(b>a) //如果b>a,交换双方的值,使大者a为被除数 { t=...原创 2018-05-11 17:03:56 · 808 阅读 · 0 评论 -
C语言求大数的阶乘
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,该如何计算?当一个数很大时,利用平常的方法是求不出来它的阶乘的,因为数据超出了范围。因此我们要用数组来求一个大数的阶乘,用数组的每位表示结果的每个位数。话不多说,直接上代码#include<stdio.h>#include<string.h>int main(){ int i,j,n,temp,d=1...原创 2018-05-06 15:18:57 · 9630 阅读 · 5 评论 -
威佐夫博弈
简述威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。分析我们用(ak,bk)(ak≤bk,k=0,1,2,...,n)(ak≤bk,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0...原创 2018-08-16 21:25:24 · 310 阅读 · 0 评论 -
排序算法总结(C++)
算法复杂度稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 一:冒泡排序经典的排序算法,通过依次比较相邻两个元素之间的大小...原创 2018-09-01 17:06:09 · 304 阅读 · 0 评论 -
最小生成树之prim算法
最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。 Prim算法过程:一条边一条边地加, 维护一棵树。初始 E = {}空集合, V = {任意节点}循环(n – 1)次,每次选择一条边(v1,v2), 满足:v1属于V , v2不属于V。且(v1,v2)权值最小。E = E + (v1,v2)V = V...原创 2018-09-25 16:03:00 · 5887 阅读 · 0 评论 -
主席树模板
日后会逐渐完善模板静态区间第k小const int maxn = 1e5 + 10;int sum[maxn << 5], root[maxn], ls[maxn << 5], rs[maxn << 5];int a[maxn], b[maxn];int n, m, tot, len;int getid(int val){ retu...原创 2019-08-06 18:46:06 · 150 阅读 · 0 评论