![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm算法模板
hzasrd
这个作者很懒,什么都没留下…
展开
-
算法模板之最近公共祖先问题(LCA)
poj1330 最近公共祖先问题模板: #include #include #include #include #include #include #include #include #define N 30000 using namespace std; int id[N],vis[N],depth[N],in[N],dp[N][20],k; vectorG[N]; int Min(原创 2017-08-10 17:34:19 · 268 阅读 · 0 评论 -
算法模板之中国剩余定理
ll p[N],m[N]; //扩展欧几里得算法 void gcd(ll a,ll b,ll &d,ll &x,ll &y) { if(b==0) { d=a; x=1,y=0; } else //else不能省略 { gcd(b,a%b,d,y,x); y-=(a/b)*x; } }原创 2017-10-13 10:51:07 · 251 阅读 · 0 评论 -
算法模板之01背包问题
二维数组的写法: int w[N],p[N]; int dp[M][N]; for(int i=0; i<n; i++) for(int j=0; j<=m; j++) if(j<w[i]) dp[i+1][j]=dp[i][j]; else dp[i+1][j]=max(dp[i][j],dp[i][j-w原创 2017-08-29 16:46:01 · 349 阅读 · 0 评论 -
算法模板之KM(带权的二分匹配)
KM模板(带权的二分匹配) int vx[N],vy[N],lx[N],ly[N],link[N],mat[N][N]; int n; int dfs(int t) { int i; vx[t]=1; for(i=1; i<=n; i++) { if(vy[i]==0&&lx[t]+ly[i]==mat[t][i]) {原创 2017-08-22 21:05:36 · 273 阅读 · 0 评论 -
算法模板之二分匹配
二分匹配模板: int m,n; int used[N],link[N],mat[N][N]; int dfs(int t) { int i; for(i=1; i<=n; i++) { if(used[i]==0&&mat[t][i]) { used[i]=1; if(link[i]==0|原创 2017-08-22 21:02:28 · 201 阅读 · 0 评论 -
算法模板之递推模板
杜教的超神递推板子,给出递推式子的前几项,就可以求出任意一项,前几项可以自己写程序暴力求出。 #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i,a,n) for (ll i=a;i<n;i++) #原创 2020-02-13 22:35:43 · 165 阅读 · 0 评论 -
算法模板之欧拉函数
欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数. 对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1). 下面两种方法求欧拉函数值,一种直接算出来的,另一种是通过筛选得来的。 #define N 5000000+10 typedef unsigned long long ll; ll Euler[N]; ll init(int n)//根据定义直接算 {原创 2017-08-21 17:33:19 · 210 阅读 · 0 评论 -
算法模板之次短路
给你N个点和R条边,问从起点到终点的次短路是多少。无向边,且可重复走。 #include #include #include #include #define MAXN 100009 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; struct edge { int to, cost;原创 2017-08-24 15:20:07 · 764 阅读 · 0 评论 -
算法模板之组合数(小范围)
小范围的组合数,大概能算到30左右吧 typedef long long ll; ll C[61][61]; void init() { memset(dp,0,sizeof(dp)); for(int i=1; i<=60; i++) { C[i][1]=i; C[i][0]=1; } for(int i=1; i<=原创 2017-08-21 15:22:28 · 207 阅读 · 0 评论 -
算法模板之RMQ
给定原序列和若干个区间,查询区间的最大值或者最小值。 int dp[N][30],a[N]; void rmq_init(int n) { for(int i=1; i<=n; i++) dp[i][0]=a[i]; for(int j=1; (1<<j)<=n; j++) for(int i=1; i+(1<<j)-1<=n; i++)原创 2017-08-20 15:29:52 · 202 阅读 · 0 评论 -
算法模板之拓扑排序
给定很多事件,做这些事件有先后顺序,输出合理的顺序。 判断有向图是否存在环。 int c[N],t,ans[N],n,m; vectorG[N]; bool dfs(int u) { c[u]=-1; for(int i=0;i<G[u].size();i++) { if(c[G[u][i]]<0) return fa原创 2017-08-20 15:24:38 · 189 阅读 · 0 评论 -
算法模板之快速幂取模
求x的n次方对mod取余,利用快速幂来计算,降低时间复杂度。 typedef long long LL; LL quick_mod(LL x,LL n) { LL res=1; while(n>0) { if(n & 1) res=(res*x)%Mod; x=(x*x)%Mod; n >>= 1;原创 2017-08-17 18:12:48 · 245 阅读 · 0 评论 -
判断两条线段是否相交(叉积)
给出两条线段,判断这两条线段是否相交。 struct Point{ double x,y; }; double mult(Point a, Point b, Point c) { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } bool intersect(Point aa, Point bb, Point cc, P原创 2017-10-14 17:37:00 · 1482 阅读 · 0 评论