![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
模板算法
Fuei
这个作者很懒,什么都没留下…
展开
-
Fleury算法求欧拉路径
小Ho:这种简单的谜题就交给我吧!小Hi:真的没问题么?小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了。小Hi:哎,我就知道你会遇到问题。小Ho:小Hi快来帮帮我!小Hi:好了,好了。让我们一起来解决这个问题。小Hi:原来是这样。。。小Ho你仔细观察这个例子:因为相连的两个数字总是相同的,不妨我们只写一次,那么这转载 2015-06-16 21:43:54 · 2251 阅读 · 0 评论 -
三分法
老是忘记,多备个模板,记住了之后删for(int it = 0;it <= 100;it++){//l,r为浮点数建议直接枚举二分次数,不然可能会精度误差造成死循环 double mid = l + (r - l) / 3.0; double midmid = r - (r - l) / 3.0; double mid_ans = cal(mid); double mi原创 2015-09-17 10:28:56 · 283 阅读 · 0 评论 -
欧拉函数
/*欧拉函数:求1~n-1中与n互质的数的个数另外若gcd(i,n) == 1的花gcd(n - i,n) == 1*///直接求解欧拉函数int euler(int n){ //返回euler(n) int res=n,a=n; for(int i=2;i*i<=a;i++){ if(a%i==0){ res=res/i原创 2015-11-08 12:30:32 · 382 阅读 · 0 评论 -
二维树状数组
/*单点修改,查询的复杂度都为log(n) * log(n)*/int sum[maxn][maxn];int n;char c;inline int lowbit(int x){ return x & (-x);}//其中n为点的总数,向上更新树状数组void add(int x,int y,int val){ for(int i = x;i原创 2015-10-29 14:14:44 · 286 阅读 · 0 评论 -
后缀数组
char s[maxn];//构造字符串s的后缀数组,复杂度为o(nlogn)int sa[maxn],t[maxn],t2[maxn],c[maxn],n;//每个字符的值必须为0~m-1void build_sa(int m){ int i,*x = t,*y = t2,n = strlen(s); for(i = 0;i < m;i++)c[i] = 0; for(i = 0;i原创 2015-10-31 10:34:05 · 236 阅读 · 0 评论 -
在线LCA算法
先打个粗糙的模板,以后再来改精细http://hihocoder.com/problemset/solution/461416#include#define mem(a,b) memset(a,b,sizeof(a))#define FOR(i,a,b) for(int i = a;i <= b;i++)using namespace std;typed原创 2015-10-19 15:00:55 · 353 阅读 · 0 评论 -
dfs序基本类型总结
大致看了下dfs序的题型,大致清楚了大致的解题思路。。。但是对于一些题目还是比较无力。。。。dfs序比较重要的性质:一棵子树的所有节点在dfs序里是连续一段,主要就是利用这个性质来解题题型一:对某个点X权值加上一个数W,查询某个子树X里所有点权值和。解:列出dfs序,实现修改一个数,查询一段序列的和,显然这个序列可以用树状数组维护。题型二:对X到Y的最短路上所有点权原创 2015-11-13 16:38:18 · 4604 阅读 · 2 评论 -
白书几何模板
/*白书几何模板*/const double eps = 1e-10;struct Point{ double x,y;//点的坐标类型自己定 Point(double x = 0,double y = 0):x(x),y(y){}};typedef Point Vector;//向量就是点的表示Vector operator + (Vector A,Vector B){原创 2015-11-26 17:26:30 · 370 阅读 · 0 评论 -
树链剖分
树链剖分就是把树上的链分成重链和轻链,然后在重链和轻链上进行求和、修改,求最大值,最小值等等。。。。树链剖分只是把找链这个环节优化到了log(n),具体的总的复杂度是多少,还要看你储存链的数据结构是什么。如果用的是线段树,那么复杂度大概是log(n) * log(n);如果用的是树套树,那么复杂度大概是log(n)*log(n)*log(n);如果是树链剖分加上树套树写区间第k大,那么原创 2015-11-29 13:25:55 · 395 阅读 · 0 评论 -
高斯消元模板(+解异或方程组)
原题链接是hiho第56周:http://hihocoder.com/contest/hiho56/problem/1用来练手高斯消元,该模板只能判断无解,多解(不能判断有几个自由变元)和小数解的情况(可以用强制转换变成整数)//其中a为方程组等号左边的矩阵,b为原方程组右边的值,temp为辅助数组,val为答案,代表等号左边xi的值double a[maxn * 2][maxn];/原创 2015-08-03 10:42:41 · 738 阅读 · 0 评论 -
Miller_Rabin质数测试
//Miller_Rabin的复杂度为S * log n//注意快速幂中的取模n可能会乘法溢出bool Miller_Rabin(ll n){//其中n为要测试的数字 if(n <= 2){ if(n == 2)return true; else return false; } if(n % 2 == 0)return false; ll u = n - 1; while(!原创 2016-04-10 10:01:38 · 413 阅读 · 0 评论 -
st函数--区间最大最小值
st函数可以处理区间的最大和最小值的问题,预处理时间需要O(nlgn)的时间,查询时间可以达到O(1)。void make_st()//st预处理{ for(int i = 1;i <= n;i++){ minn[i][0] = ori[i]; maxx[i][0] = ori[i]; } for(int j = 1;(1 << j) <= n;j++)//递推求区间最原创 2015-07-21 20:28:30 · 1114 阅读 · 0 评论 -
java大数模板
java大数的头文件:import java.math.BigDecimal; import java.util.Scanner; import java.math.BigInteger; 大致模板:import java.math.BigDecimal; import java.util.Scanner; import java.math.BigInteger;原创 2015-08-05 21:30:04 · 1290 阅读 · 0 评论 -
单调队列--优化dp
单调队列的定义:一种严格单调的队列(严格递增或者递减),其中队列中元素的位置也有一定的递增递减的性质。队首位置保存的是最优解,接着次优解。。单调队列的维护(假设队列为严格递增队列):1.新插入一个数到队尾(此时还没有插入),比较当前队尾的数和当前插入的数,如果当前插入的数小于队尾的数,弹出队尾的数。。。继续比较队尾的数和当前插入的数,直到队尾的数小于当前插入的数为止,在队尾插入当前原创 2015-07-24 18:41:50 · 402 阅读 · 0 评论 -
线性筛选素数(欧拉筛选)
bool ok[maxn];//自然数表int prime[maxn];//素数数组int tol;//素数长度void make_prime(){ tol = 0; for(int i = 2;i < maxn;i++){ if(!ok[i])prime[tol++] = i; for(int j = 0;j < tol;j++){ if(i * prime[j] >=原创 2015-07-26 09:48:32 · 494 阅读 · 0 评论 -
最小费用最大流模板
typedef long long ll;const int maxn = 1000005;const int INF = 0x3f3f3f3f;const int e_maxn = 200000 * 4;const int v_maxn = 15000;struct ppp{ int v,nex,cap,flow,c;}e[e_maxn];int head[v_maxn],pr原创 2015-07-27 13:53:36 · 321 阅读 · 0 评论 -
最大流模板
#include#define mem(a,b) memset(a,b,sizeof(a))#define For(a,b,c) for(int a = b;a <= c;a++)using namespace std;typedef long long ll;const int maxn = 1000005;const int INF = 0x3f3f3f3f;const int原创 2015-07-27 10:08:14 · 311 阅读 · 0 评论 -
tarjan算法(边的双连通分量)
hiho链接:http://hihocoder.com/contest/hiho53/problem/1边的双连通分量定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。显而易见的是,这种双连通分量其实就是把原图中的桥给删去后的子图,每一个联通块都是一个双连通分原创 2015-08-09 18:05:06 · 2687 阅读 · 1 评论 -
tarjan算法求联通块中求割点和割边
来自hiho的第五十二周,参考链接:http://hihocoder.com/contest/hiho52/problem/1//tarjan中可见dfs_pos,low数组不需要初始化//如果有多个联通分块,那么就要枚举每个未访问过的点进行tarjan,进行tarjan前先将fa[i] = -1//这里的se为set,存放割点;edge为vector >,存放割边void ta原创 2015-08-09 15:28:24 · 445 阅读 · 0 评论 -
tarjan算法求强连通分量
hiho详解链接:http://hihocoder.com/contest/hiho54/problem/1强连通分量的定义:对于有向图上的2个点a,b,若存在一条从a到b的路径,也存在一条从b到a的路径,那么称a,b是强连通的。对于有向图上的一个子图,若子图内任意点对(a,b)都是满足强连通,则称该子图为强连通子图。非强连通图有向图的极大强连通子图,称为强连通分量。特别的,任意一个和原创 2015-08-10 10:24:32 · 280 阅读 · 0 评论 -
tarjan求点的双连通分量
hiho详解链接:http://hihocoder.com/contest/hiho55/problem/1点的双连通分量的定义:对于一个无向图的子图,当删除其中任意一个点后,不改变图内点的连通性,这样的子图叫做点的双连通子图。而当子图的边数达到最大时,叫做点的双连通分量。可以知道的是,桥一定是点的双连通分量。void pop_stack(int x)//边不断原创 2015-08-10 13:53:54 · 503 阅读 · 0 评论 -
莫比乌斯反演
莫比乌斯反演大都是处理(运用这个式子的题目始终没见过,见过了再说)和(最常用的公式),说白了莫比乌斯反演就是加快和简化容斥集合的演算的作用,在数论中比较重要。莫比乌斯反演的比较重要的性质:对于u(d): (1)若,那么 (2)若,均为互异素数,那么 (3)其它情况下还有如下一些性质:(1)对任意正整数有原创 2015-07-30 10:27:34 · 493 阅读 · 0 评论 -
凸包模板
struct Node{ int x,y; Node(int _x = 0,int _y = 0):x(_x),y(_y){} bool operator return x == b.x ? y } Node operator - (Node b){ return Node(x - b.x,y -原创 2015-07-14 18:29:00 · 242 阅读 · 0 评论 -
LCA(最近公共祖先) 离线法(tarjan算法)
题目的来源是hiho题库的1067http://hihocoder.com/problemset/problem/1067具体做法:dfs整棵树,对与每个节点进入的时候先标记为1,退出该节点的时候将该节点标记为2,没被扫描过的标记为0由此可知,对于扫到的某个点在询问中要求它和另外一个点的最近公共祖先.如果另外一个点的标记为0,说明没有被扫描到过,那么继续搜索.如原创 2015-07-22 19:20:44 · 363 阅读 · 0 评论 -
KMP算法
/*这是对失配函数没有优化的MP算法,最坏情况下也能达到O(m + n)的复杂度,其中m为模板串长度,n为文本串长度.此算法还可以计算模板串在文本中出现的次数(可重叠)*/char s[maxn],t[maxn];//s为文本,t为模板int f[maxn];//失配函数void getFail(char *P,int *f){ int m = strlen(P); f[0] =原创 2015-10-31 11:45:26 · 281 阅读 · 0 评论