
ACM_算法_模板
文章平均质量分 65
RaAlGhul
这个作者很懒,什么都没留下…
展开
-
ACM_模板_背包问题
背包问题是属于动态规划中的一种非常经典的运用,小编在这里大力推荐dd_engi的背包九讲,这种超级详细的讲解在小编心中是可以得到诺贝尔文学奖的~1.01背包首先是最基础的01背包问题,所有元素只能使用一次,此问题只需要考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物 品放入容量为v的背包中”,价值为f[i-...原创 2016-03-01 12:58:56 · 2263 阅读 · 0 评论 -
ACM_模板_中国剩余定理(互质与非互质)
中国剩余(余数)定理,又称孙子定理,是我们老祖宗智慧的结晶,而在我们ACM界,又是一种黑箱算法,每次需要时只需要套模板即可搞定。此算法编写上的精华在于每次通过扩展欧几里得算法求得每一个的相应解,最后再加起来求得总和的余数即可(什么?你问小编什么是扩展欧几里得算法和中国剩余定理……百度百科讲的很清楚……小编觉得没必要再单独介绍了)#include int exGcd(int a,int b原创 2016-03-04 21:42:08 · 2030 阅读 · 0 评论 -
ACM_模板_最小公倍数
gcd函数的书写方式有很多种,很多人都是用循环的,而小编的模板用则是用函数的递归,从代码上很简介,且非常易于理解。#include//最小公倍数int gcd(int a,int b){ if(a<b) return gcd(b,a); if(!b) return a; return gcd(b,a%b);}int main(){ int m,n; while(原创 2016-02-26 20:32:28 · 732 阅读 · 0 评论 -
ACM_算法_Lucas定理
Lucas定理是用于求解C(n,m)%p的问题这里小编用一张图:这张图就很完整的说明了Lucas定理的内容,比较简单,也比较好理解,小编也就不多说了。#include #include #include #include using namespace std;typedef long long LL;LL Power_mod(LL a, LL b, LL p){原创 2016-06-24 14:19:20 · 4638 阅读 · 1 评论 -
ACM_容斥原理
容斥原理是在计数时,必须注意没有重复,没有遗漏。于是人们想出来的一种计数方法:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复。用两个集合来讲就是A∪B =|A∪B| = |A|+|B| - |A∩B |,如果是三个集合的话就是|A∪B∪C| = |A|+|B|+|C| - |A∩B| - |B∩C| - |C∩A原创 2016-04-18 20:27:24 · 1375 阅读 · 0 评论 -
ACM_拓扑排序
首先解释一下什么是拓扑排序,比如打一场比赛,A打赢了B,B打赢了C……让你给出一个排名,这个过程用到的就是拓扑排序。相当于说给了你一些条件使得某一个元素在排序时一定在另一个的前面,最后在排个序。这个问题我们可以这样取处理,如果给出条件A不在B前面,那么我们建立一个A->B的有向边,不难发现,入度为0的点肯定是在最前面的,因为没有点一定在其前面。这个时候我们先把这个点去掉,剩下的点中我们同样原创 2016-05-23 20:11:41 · 872 阅读 · 0 评论 -
ACM_置换群 burnside引理 Polya定理
置换群也是群论当中一个比较重要的内容,可是在离散课上老师直接跳过了这章内容我也是……(日了dog了),自己看了半天资料总算是有点眉目了。1.置换群:……2.burnside引理:……3.Pólya定理:……原创 2016-06-27 14:06:01 · 6447 阅读 · 1 评论 -
ACM_算法_二叉树遍历方法的互相转换 (TOJ 3988 Password)
题目链接:http://acm.tju.edu.cn/toj/showp3988.html很裸的一道二叉树的题目,题意很简单,通过先序遍历(root,left,right)和中序遍历(left,root,right),推出后序遍历(left,right,root)。二叉树就是一个搜索的教科书,我们用到的方法也是深度搜索(DFS),举个例子先序遍历:DBACEFHGI。中序遍历:AB原创 2016-07-10 18:56:36 · 1799 阅读 · 0 评论 -
ACM_欧拉函数(eular) 及其引申性质
欧拉函数(euler)是一个在数论中使用比较多的算法。欧拉函数表示的是比一个数n小的正整数数中和n互质的数的个数,用φ(n)来表示。定义很简单关键是计算的问题。我们先看一下欧拉函数的性质:1.首先,如果n是一个质数,那么比n小的数都和它互质,也就是说φ(n) = n-1。2.如果一个数是一个质数p的幂,即n = p^k,则φ(n) = p^k-p^(k-1) = (p-1)*p^(k-1)原创 2016-06-28 21:13:56 · 1318 阅读 · 0 评论 -
ACM_模板_网络流
第一次接触网络流,感觉像是一堆的算法扑面而来,三天就要过去了,才刚刚对几个算法有了点初步的理解,感觉上离要熟练的做出题还很遥远,这里先给出小编对几个算法的模板总结。1.Edmond-Karp算法这种算法是最好理解的,网络上也有很多的对此算法的讲解,这里小编就不给出详细的讲解。算法的关键就是不停的在残留网络中找到增广路径,并不停的修改残留网络中的值,最后知道找不到增广路径为止,得到最大流。原创 2016-02-25 22:12:13 · 662 阅读 · 0 评论 -
ACM_模板_Manacher算法
和KMP算法一样,Manacher算法也是一个O(n)的算法,可以在低复杂度的情况下判断最长的回文串长度。讲解这个算法之前,大家可以回顾一下KMP算法,KMP算法的应用是用到了一个next数组进行跳转来,其原理就是如果当我们匹配到某一位不再相同的时候那么前面的就能确定(有关这个不懂得可以去看小编的KMP算法讲解),充分应用这个信息可以省去很多不必要的匹配步骤。Manacher算法也是一样,原创 2016-04-08 13:19:47 · 855 阅读 · 0 评论 -
ACM_模板_并查集
有关并查集,最关键的就是两个函数,一个是find(查找),一个是merge(合并),有关并查集的两个函数,也有两种书写的方法,两种书写方法的复杂度是不同的,一种是查找快,合并慢,一种是查找慢,合并快。小编给出的模板则是第二种,因为第二种的使用更加普及,优化起来也有深奥的路径压缩(这里小编就不去介绍了)。#include //简易并查集int set[1002];int find(int x原创 2016-02-28 22:46:06 · 797 阅读 · 0 评论 -
ACM_扩展欧几里得算法
我们先来回顾一下欧几里得算法,欧几里得算法是用于求两个数的最大公约数:其核心为一句 Gcd(a, b) = Gcd(b, a%b) (Gcd表示两个数的最大公约数),直到a%b == 0时,可得到Gcd(a,b)的具体值。我们再来看一下扩展欧几里得算法在乘法逆元上的运用,先来介绍一下乘法逆元,可能一些没有学过离散数学的同学并不知道逆元是什么,集合中的某一个数与其逆元做相应的二元运算得到的就是这原创 2016-05-23 18:59:13 · 1290 阅读 · 0 评论 -
ACM_最短路
(1) Floyd算法Floyd算法是一种极其暴力的方法,其原理是枚举每两个点之间可能的路并找到其最小值,复杂度为O(n^3),不过其优点能够一次直接找到所有点两两之间的最短路,缺点当然就是太过暴力,一般数据上了100可能就很容易炸时间。void Floyd(){ for(int k=0; k<n; k++) for(int i=0; i<n; i++) { if(d原创 2016-05-25 21:55:23 · 792 阅读 · 0 评论 -
ACM_模板_Tarjan算法
Tarjan算法,用于解决2-SAT问题,刚刚接触2-SAT问题的时候以为就是二分图匹配,套着匈牙利算法的模板发现半天解不出来,后来发现这是一个独立的算法,也是一个独立的问题。不过Tarjan算法也不是什么高深的算法,理解起来也相对容易,用起来也比较方便,模板也比较好套,有关Tarjan算法的讲解小编觉得百度百科已经讲的非常详细了,小编这里就不再进行赘述,直接上模板。小编这里就以HDOJ上的迷宫城原创 2016-03-29 18:50:10 · 1474 阅读 · 0 评论 -
ACM_模板_指数型母函数
普通型母函数主要是来求组合的方案数,而指数型母函数是求多重排列数。这里小编引用百度百科上的对指数型母函数的讲解。指数型母函数问题: 假设有n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列。若其中某一元素a1重复了n1次,全排列出来必有重复元素,其中真正不同的排列数应为n!/n1!,即其重复度为n1!同样理由a1重复了n1次,a2重复了原创 2016-02-29 19:02:35 · 801 阅读 · 0 评论 -
ACM_模板_字典树
字典树Trie是一门比较简单也比较好懂的算法,因为字典本身是生活中使用率较高的工具,字典的工作原理大家也都懂,其本质也就是前缀查询,对前缀查询的方法,大家很容易可以想到数据结构中的链表结构,用指针去实现一个连接作用。在这里,小编先讲解一下数的指针建立。首先因为我们字母只有26个,每个节点的指向可以加一个26节点的指针(不考虑大小写),在每输入一个字符串的时候就建立节点。小编先给出指针实现的原创 2016-03-02 10:57:14 · 880 阅读 · 0 评论 -
ACM_模板_线段树
线段树,作为一项统计神学,和树状数组一样也是一项需要掌握的杀手锏。线段树的代码分为三个模块:建树·更改·查询。1.建树:建树的过程是通过不断的分成左子树和右子树,一层一层的叠上去。采用的是递归的思想。void Build(int left,int right,int rt){ if(left == right) { scanf("%d",&tre原创 2016-03-15 17:51:29 · 496 阅读 · 0 评论 -
ACM_模板_二分图匹配(匈牙利算法)-DFS
二分图作为网络流中的一类特殊题型,都是可以运用网络流的解法来做,但是二分图也拥有自己的比较简单的算法来求出最大匹配--匈牙利算法,有关匈牙利算法的讲解,由于在百度百科上有详细解释,小编在这里就不再赘述。此算法的写法有两种,一种DFS一种BFS,BFS写法建立匈牙利树效率更高,但是代码冗长,很难再文面上直接看懂,而DFS的写法代码短小清晰,易于理解,小编这里介绍的也是有关DFS的邻接图写法。#i原创 2016-03-07 21:31:46 · 773 阅读 · 0 评论 -
ACM_模板_进制转换
有关于进制转换的问题,关键就是用C语言去模拟短除法的过程。#include //进制转换int main(){ int N,R,k,a[20],i; while(scanf("%d%d",&N,&R)!=EOF) { k=0; if(N<0) { N=-N; k=1; } i=0; while(N) { a[i++]=N%R; N/原创 2016-02-26 20:55:02 · 621 阅读 · 0 评论 -
ACM_模板_求质因子
求一个数的质因子用到的方法就是有策略的暴力,没求出一个质因子,就让原数消除这一个因数。//求一个数的质因子#include int main(){ __int64 a[100],num,i,n; while(scanf("%I64d",&n)!=EOF) { num=0; for(i=2;i*i<=n;i++) {原创 2016-02-26 21:03:54 · 1011 阅读 · 0 评论 -
ACM_模板_KMP算法
记得以前刚刚开始学ACM的时候,经常遇到那种处理字符串的题,每次都是傻乎乎的进行暴力模拟,事后还对那些没做出来的同学予以嘲讽"暴力模拟都不会?",现在想想,当时的题数据都太弱,要是稍微数据强点的话就会TLE,自己以最笨的方法做出来的还去嘲笑别人……言归正传,KMP算法是一种很机智,很经典的方法,在我们不知道这个算法的时候(就像我刚刚开始学ACM的时候一样),遇到这种判断一个字符串里是否包含另一个模原创 2016-04-05 22:00:02 · 917 阅读 · 0 评论 -
ACM_模板_最小生成树
最小生成树,其本质还是并查集,经典运用就是Kruskal算法,对边权进行排序后,由小到大进行合并处理,直到形成一颗树为止。#include//最小生成树#includeusing namespace std;int root[101];int N,Q,i,j,a,b,d,t,ans;struct road{ int s; int e; int d;}edge[5051];原创 2016-02-28 23:43:46 · 669 阅读 · 0 评论 -
ACM_模板_母函数
母函数作为一类数学思维的转换运用,由于算法本身很好理解,其关键也是是一套模板的灵活运用,所以也没什么好讲的,小编以整数拆分为例,给出小编母函数的模板。#include //母函数 #define maxn 10000int c1[maxn+1],c2[maxn+1];int main(){ int n,i,j,k; while(scanf("%d",&n)!=EOF) { f原创 2016-02-29 18:55:25 · 865 阅读 · 0 评论 -
ACM_模板_求一个数的所有因子和(预处理打表)
对于求一个数n的所有因数和,可能很多人的第一想法是遍历1~sqrt(n)来找其因数,但是这样做不好的地方就是我们可能会遍历大量没有用的数,浪费了很多时间,所以我们与其是求一个数的所有因数和不如求一个数在一个范围内是哪些数的因数,这样求解就可以省去大量的时间,从而达到预处理打表的效果。#include const int maxn = 500000+2;int sum[maxn];int原创 2016-04-12 13:09:48 · 3943 阅读 · 0 评论 -
ACM_模板_树状数组
树状数组作为一种数据结构,很广泛的运用到关于统计的问题中,树状数组通过类似数的结构每一位都记录的是从前面到这个点所有的和,要修改起来也很方便。在代码上树状数组也很简单,就是核心的三个函数。const int maxn = 1002;//一维树状数组 int c[maxn];int Lowbit(int x){ return x&(-x);}void update(int x,int原创 2016-04-13 09:15:46 · 761 阅读 · 0 评论 -
ACM_模板_Gale_Shapley算法(稳定婚姻)
Gale_Shapley算法又称延迟认可算法,是用于解决稳定婚姻问题的算法,其原理就是每一轮男性(男性还是女性都没有关系)都向自己最喜欢的女生表白,女生每一轮都答应自己向自己表白的人中自己最喜欢的,然后没有配对的男生继续表白,如果表白的女生已配对但是更喜欢他就放弃现在的配对对象和他配对,被抛弃的男生继续刚刚的循环工作。这就是Gale_Shapley算法,在不断的表白去配对,直到所有人都配对,此原创 2016-04-13 09:51:01 · 1558 阅读 · 1 评论 -
深度分析 -- 二分查找 到底要怎么写
前景提要:很早以前,在知乎上,有人问了这么个问题:二分查找有几种写法?它们的区别是什么?问题链接:https://www.zhihu.com/question/36132386这个问题的回答者中赞最多的人也是小编昔日的ACM队友LightGHLi,那么小编先从队友LightGHLi的回答中开始讲起:首先是说到二分的写法种类,LightGHLi的分析是这样的:中值的取值方法有:向上取整,向下取整 ...原创 2018-07-04 18:14:54 · 837 阅读 · 0 评论