随笔分类 -
模板
卡特兰数
摘要:模型:一个凸n边形,用n-3条不相交的对角线把它分成n-2个三角形,求不同的方法数目边界为f(2)=f(3)=1,第四项开始为2、5、14、42、132、429、1430、4862、16796递推公式:f(n+1)=(4*n-6)*f(n)/n
阅读全文
母函数
摘要:解决一类整数拆分问题void mu(){ memset(c1,0,sizeof(c1)) ; memset(c2,0,sizeof(c2)) ; for(int i=0 ;i<=a[0]*b[0] ;i+=a[0])//a[i]第i项单价 b[i]第i项数量 c1[i]=1 ; for(int i=1 ;i<n ;i++)//n代表总共的单价数量 { for(int j=0 ;j<=sum ;j++)//sum代表幂次上限 { for(int k=0 ;k+j<=sum && k<=a[i]*b[...
阅读全文
数位dp
摘要:http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html写得够好了个人习惯从1计数。。无伤大雅。。dp数组最开始memset成-1一次就够了int dfs(int i,int s,int e){ if(!i)return s==target_s ; if(!e && dp[i][s]!=-1)return dp[i][s] ; int u=e?digit[i]:9 ; int res=0 ; for(int d=0 ;d<=u ;d++) res+=dfs(i-1,new_s,e &&...
阅读全文
乘法逆元
摘要:d模f的乘法逆元int Extend_Eulid(int d,int f){ int x1,x2,x3,y1,y2,y3 ; x1=1,x2=0,x3=f,y1=0,y2=1,y3=d ; while(y3 && y3!=1) { int q=x3/y3 ; int t1,t2,t3 ; t1=x1-q*y1,t2=x2-q*y2,t3=x3-q*y3 ; x1=y1,x2=y2,x3=y3 ; y1=t1,y2=t2,y3=t3 ; } if(!y3)return -1 ; ret...
阅读全文
Graham扫描法
摘要:Graham扫描法求凸包的模板运行之后可以得到存有凸包顶点的栈s和栈顶指针top,n代表总点数这个模板我当时调了很久,主要难点有两个,一个是正确的极角排序,一个是出栈入栈的细节操作,逆时针扫描,这里注意栈内元素不能少于三个,新的点在当前线的顺时针方向就出栈,逆时针入栈这个算法总体来讲还是简单易懂的,...
阅读全文
LCS
摘要:最长公共子序列的记忆化搜索模板a,b数组分别存两个字符串,dp数组初始化为-1s1表示a串起始地址,e1表示a串结束地址+1,s2、e2同理表示b串int LCS(int s1,int e1,int s2,int e2){ if(dp[s1][s2]!=-1) return dp[s1][s2] ; if(s1==e1 || s2==e2) return dp[s1][s2]=0 ; if(a[s1]==b[s2]) return dp[s1][s2]=1+LCS(s1+1,e1,s2+1,e2) ; else ...
阅读全文
最短路
摘要:迪杰斯特拉算法重点是松弛操作,解释为用一个dis数组记录从起点走到当前点的最短距离,如果当前点的dis值加上走到相邻点的距离小于相邻点的dis值,则更新相邻点的dis为前面两数之和。之后不断维护dis的值直到终点。实现方面可以用优先队列不断取出dis值小的点,到终点结束。head提前全置为-1,无向...
阅读全文
最大流之EK
摘要:朴实的最大流算法View Code int EK(int s,int t){ int inf=0xfffffff ; int u,i,flow ; int ans=0 ; while(1) ...
阅读全文
tarjan
摘要:求强连通分量个数View Code void tarjan(int u){ dfn[u]=low[u]=++idx ; vis[u]=1 ; st[++tp]=u ; int v ; for(int i=head[u];i;i=e[i].next) { ...
阅读全文
01,完全,多重背包
摘要:View Code void ZeroOnePack(int c,int w){ for(int i=V;i>=c;i--) dp[i]=max(dp[i],dp[i-c]+w) ; return ;}void CompletePack(int c,int w){ for(int i=c;i<=V;i++) dp[i]=max(dp[i],dp[i-c]+w) ; return ;}void MultiplePack(int c,int w,int a){ if(c*a>=V) { CompletePack(c,w)...
阅读全文
判断线段相交
摘要:struct point{ double x,y ;} ;double direction(point p1,point p2,point p){ return (p.x-p1.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p.y-p1.y) ;}bool online(point p1,point p2,point p){ return (p.x=min(p1.x,p2.x) && p.y=min(p1.y,p2.y)) ;}bool intersect(point p1,point p2,point p3,point p4){ double d1=dire...
阅读全文
米勒拉宾素数测试
摘要:直接献上模板View Code __int64 qpow(int a,int b,int r)//快速幂 { __int64 ans=1,buff=a; while(b) { if(b&1)ans=(ans*buff)%r; buff=(buff*buff)%r; b>>=1; } return ans;}bool Miller_Rabbin(int n,int a)//米勒拉宾素数测试 { int r=0,s=n-1,j; if(!(n%a)) return false; while(!(...
阅读全文
KMP
摘要:AB串下标都从1开始,kmp函数返回第一次成功匹配的A串下标,把其中注释去掉可以匹配多个Next[i]表示位置长度为1-i的字符串最多有长度为Next[i]的前缀等于其后缀char A[1000005],B[1000005] ;int Next[1000005],lenA,lenB ;void Ge...
阅读全文
LIS
摘要:O(nlog(n))的算法,网上讲解有很多,我就不在这里献丑了,直接上模板该模板计算从1到n的LIS,p[]为存放数列的数组最长上升子序列View Code int LIS(int n){ int l,r,m,i,tail = 0; for ( dp[ ++ tail ] = p[ 1 ...
阅读全文
输入挂
摘要:今天起决定总结自己做题写出来的遇到的找到的各种模板,先从输入挂开始啦有的题目需要大规模输入,很多情况用cin超时,用scanf就能过,因为scanf的速度远远快于cin。但是比scanf还要nb的输入是getchar(),这个读入速度极快,输入挂就是基于这点写的。整数View Code inline bool scan_d(int &num) { char in;bool IsN=false; in=getchar(); if(in==EOF) return false; while(in!='-'&&(in<'0'||in>
阅读全文
|
|