![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM模板
文章平均质量分 63
椰子Tyshawn
你眼中的世界就是你自己的样子。
展开
-
最大子段和与最大M子段和模板
最大子段和:int Sum(int* a, int n)/*a为序列,n为序列长度*/{ int curSum = 0; int maxSum = 0; for (int i = 0; i < n; i++) { if (curSum + a[i] < 0) curSum = 0; else原创 2017-03-21 15:40:50 · 643 阅读 · 0 评论 -
母函数模板---解决组合数问题
母函数,又称生成函数,是ACM竞赛中经常使用的一种解题算法,常用来解决组合方面的题目。母函数通常解决类似如下的问题:(1)给5张1元,4张2元,3张5元,要得到15元,有多少种组合?(2)某些时候会规定至少使用3张1元、1张2元、0张5元。(3)某些时候会规定有无数张1元、2元、5元。……模板(1):/*26个字母,A的价值为1,B的价值原创 2017-03-11 16:05:55 · 660 阅读 · 0 评论 -
Prim算法和Kruskal算法模板
void createGraph(){ //lowcost表示每个点的最小花费,closet表示最小花费对应相连的点,visited区分两个集合 memset(graph,0,sizeof(graph)); memset(lowcost,0,sizeof(lowcost)); memset(closet,0,sizeof(closet)); memset(v原创 2016-11-06 13:19:39 · 1571 阅读 · 0 评论 -
并查集
并查集用来判断是否有闭合回路。例题:树的判定模板:const int MAXN = 50001; /*结点数目上限*/int pa[MAXN]; /*pa[x]表示x的父节点*/int rank[MAXN]; /*rank[x]是x的高度的一个上界*/int n, ans; /*创建一个单元集*/void make_set(int原创 2017-02-03 16:56:37 · 194 阅读 · 0 评论 -
快速幂与矩阵快速幂
快速幂模板:const int MOD = 10007; int PowMod(int a, int n)//a^n%MOD { int ret = 1; while(n) { if(n & 1) ret = ret * a % MOD; a = a * a % MOD; n >原创 2016-09-01 22:33:22 · 282 阅读 · 0 评论 -
欧几里德算法与扩展(中国剩余定理)
1.欧几里德算法(求余)int gcd(int a,int b){ if(!b) return a; else return gcd(b,a%b);}2.扩展欧几里德算法 该算法用于求二元一次方程:a*x+b*y=c; 原理:(1)a*x+b*y=gcd(a,b)一定有解,要想求出(2)a原创 2016-08-18 17:19:43 · 445 阅读 · 0 评论 -
STL
队列:queue优先队列:默认数值大的优先级大重写成数值小的优先级大: bool cmp(int a,int b){return a>b;} //默认return a,cmp);原创 2016-08-20 15:00:49 · 383 阅读 · 0 评论 -
巴什博弈模板(最后拿完硬币的输)
/*n个硬币,最少拿p个,最多拿q个,最后一个拿完的输;问:第一个拿的是否有必赢的策略?*/#include#includeusing namespace std;int main(){ // freopen("input.txt","r",stdin); int n,p,q; while(~scanf("%d%d%d",&n,&p,&q)){原创 2017-03-26 14:36:38 · 860 阅读 · 0 评论 -
DFS和BFS
使用范围:DFS用来搜索是否能够到达目的地BFS用来搜索最短路径或最小次数DFS模板:DFS(dep,…) //dep代表目前DFS的深度{ if (找到解||走不下去了) { … return; } 枚举下一种情况,DFS(dep+1,…)}BFS模板:原创 2016-07-27 16:13:18 · 352 阅读 · 0 评论 -
二分图最大匹配算法模板
定义:把一个图的顶点划分为两个不相交集 U 和 V ,使得每一条边都分别连接U 、 V 中的顶点。如果存在这样的划分,则此图为一个二分图。问题:如果在某一对男孩和女孩之间存在相连的边,就意味着他们彼此喜欢。那最多有多少互相喜欢的男孩/女孩可以配对?模板:/*输入k,m,n。分别表示可能的配对数目,女生的人数,男生的人数。求:互相喜欢的男女生对数。原创 2017-03-16 21:54:12 · 638 阅读 · 0 评论 -
拓扑排序
理论:拓扑排序是一种相对顺序。如课表,要想学web技术,得先学java和数据结构,但Java和数据结构这两门课谁先谁后没有要求。模板:正向拓扑:const int MAX=205;int n,m;int inDegree[MAX];int graph[MAX][MAX];int result[MAX];void creatGragh(){ int a,b;原创 2016-10-23 21:27:47 · 379 阅读 · 0 评论 -
0-1背包、部分背包和完全背包模板
理解模板:#include#includeusing namespace std;const int maxn=3500;int v[maxn],w[maxn];/*物品的价值和重量*/int m[maxn][13000];/*存最优解*,i个物品,容量j*/int x[maxn];/*中间量*/int c;/*背包容量*/int n;/*n个物品*/void knapSa原创 2017-03-21 22:19:22 · 736 阅读 · 0 评论 -
最长公共子序列和最长递增子序列模板
最长公共子序列:/*输入两个字符串序列,求最长公共子序列及其长度。*/#include#include#include#includeusing namespace std;const int maxn =105;char x[maxn],y[maxn];/*两个字符串序列*/int c[maxn][maxn];/*记录序列Xi和Yj的最长公告子序列的长度。Xi={x原创 2017-03-20 23:10:54 · 431 阅读 · 0 评论 -
acm常用公式
1.取模:(a + b) % p = (a % p + b % p) % p (1)(a – b) % p = (a % p – b % p) % p (2)(a * b) % p = (a % p * b % p) % p (3)(a^b) % p = ((a % p)^b) % p (4)原创 2016-08-09 09:53:44 · 924 阅读 · 0 评论 -
acm一些基础小知识
1. 0,1是基数,2是偶数。2. 0!=0原创 2016-08-24 11:56:10 · 383 阅读 · 0 评论 -
矩阵连乘算法模板
什么是矩阵连乘问题?*给定n个矩阵{A1,A2,A3,...,An},求这n个矩阵的连乘积A1A2...An,乘法次数最小值和矩阵连乘最优计算次序。*由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。*矩阵Ai的维度为 pi-1 X pi 。/*已知矩阵维数的一维数组,求矩阵连乘最优计算次序和最少次数的乘法。*/#include#includ原创 2017-03-20 22:28:11 · 1233 阅读 · 0 评论 -
acm水题易错点
1.注意数据范围; a.特殊数据,如0 b.输入数据量很大时用scanf (否则超时) c.当数据很大时用long long,还大就用字符串string(与取模联用) d.当题目没提高数据范围时可能很大,用string原创 2016-08-08 17:28:48 · 920 阅读 · 0 评论 -
ACM锻炼方案-POJ题目分类
ACM训练方案-POJ题目分类ACM online Judge中国:浙江大学(ZJU):http://acm.zju.edu.cn/北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/杭州电子科技大学(HDU):http://acm.hdu.edu.cn/中国科技大学(USTC):http://acm.ustc.edu.cn/ 北转载 2016-07-30 15:11:35 · 869 阅读 · 0 评论 -
KMP算法
KMP的理论已经有人总结的很好了,在此就不再赘述,需要了解的可以看这篇文章:【经典算法】——KMP,深入讲解next数组的求解 **next的一个性质:字符串s可以由多少个a组成(s = a^n),len为s的长度,当len%(len-next[len])为0的时候,答案为len/(len-next[len]),否则为1; 不过里面的代码我不怎么喜欢原创 2016-08-06 11:16:54 · 249 阅读 · 0 评论 -
二分法(binary search)
适用范围:1.某个有序表里找某个数。2.在一个(实数)范围里找某个满足条件的值。条件:1.顺序存储结构。2.有序。STL提供的二分法:upper_bound(a,a+k,value)---返回一个递增序列中第一个大于value的位置;lower_bound(a,a+k,value)---返回一个递增序列中第一个大于等于value的位置;模板:原创 2016-07-25 09:47:54 · 523 阅读 · 0 评论 -
三分法
*使用范围:我们知道二分法可以用来求单调函数的零点三分法就是用来求单峰函数的极值*怎么做?1.先求出L和R的中点mid2.再求出mid和R的中点mmid3.比较f(mid)和f(mmid)的大小 if (f(mid) > f(mmid)) R = mmid; else L = mid;算法的正确性:原创 2016-07-25 10:41:09 · 500 阅读 · 0 评论 -
中缀表达式,后缀表达式,前缀表达式
一、中缀表达式转后缀表达式规则:中缀表达式a + b*c + (d * e + f) * g,其转换成后缀表达式则为a b c * + d e * f + g * +。转换过程需要用到栈,具体过程如下:1)如果遇到操作数,我们就直接将其输出。2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符转载 2016-10-02 21:04:38 · 995 阅读 · 0 评论 -
字典树模板
字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。字典树主要用来处理单词前缀问题。如统计难题 , Phone List 模板1:const原创 2017-02-06 17:55:48 · 318 阅读 · 0 评论 -
根据先序遍历和中序遍历结果求后续遍历模板
const int maxn=105;char s1[maxn],s2[maxn],s[maxn];//s1为先序遍历结果,s2为中序遍历结果,s为后续遍历结果void build(int n,char *s1,char *s2,char *s) //n为字符串长度{ if(n<=0) return ; int p = strchr(s2,s1[0])-s2; bui原创 2017-02-08 16:43:48 · 487 阅读 · 0 评论 -
线段树模板
一:改点求点// 输入格式: // N M 数组范围是a[1]~a[N]。操作有M个 // 1 p v 表示设a[p]=v // 2 L R 查询a[L]~a[R]的max// 求min只需把max改成min,把ans初始值设为无限大#include#include#includeusing namespace std;const int MMA原创 2017-02-13 20:14:40 · 246 阅读 · 0 评论 -
RMQ (Range Minimum/Maximum Query)区间最值查询
const int maxn=100005;int num[maxn],mm[maxn][20],mi[maxn][20]; //num存初始数据,mm存最大值,mi存最小值//先进行预处理void rmq_isit(int n) //n为士兵个数{ for(int i=1;i<=n;i++) mm[i][0]=mi[i][0]=num[i]; //nu原创 2017-01-29 10:53:38 · 312 阅读 · 0 评论 -
树状数组模板
树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。改点求段:const int maxn=50005;int c[maxn]; //划分原创 2016-11-19 17:44:03 · 368 阅读 · 0 评论 -
判断素数的模板
bool is_prim(int x){ if(x==0||x==1) return false; if(x==2) return true; for(int i=2;i if(x%i==0) return false; return true;}原创 2016-09-12 14:44:48 · 406 阅读 · 0 评论 -
字符串问题
1.对于字符串处理问题,不要一次读一行,每次读一个数据,最后以换行符或点(.)结束。2.字符匹配问题用栈,字符串匹配问题用kmp。原创 2016-09-13 20:10:52 · 282 阅读 · 0 评论 -
归并排序
归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序的子序列合并为整体有序序列。归并排序是分治算法的一个典型的应用,而且是稳定的一种排序。归并排序就是先递归的分解数列,再合并数列就完成了归并排序。适用题型:求逆序数 模板:void Merge(int a[],int start,原创 2017-02-01 16:38:57 · 414 阅读 · 0 评论 -
任意多边形面积模板
/*n个点,按照顺时针或逆时针给出,然后求面积。*/#include#include#include#includeusing namespace std;const int maxn =105;typedef struct node{ double x,y;}node;node a[maxn];double cal(node x,node y,原创 2017-02-25 11:23:09 · 433 阅读 · 0 评论 -
冒泡排序、选择排序、插入排序、快速排序
1、冒泡排序:n个数比较n-1次,每次在无序序列中两两进行比较,把最值沉底。//升序void BubbleSort(int a[], int n){ for(int i = 0; i &lt; n-1; i++){ for(int j = 0; j &lt; n-1-i; j++){ if(a[j] &gt; a[j+1]){ int原创 2017-10-10 11:46:51 · 369 阅读 · 0 评论