
acm算法模板
hzasrd
这个作者很懒,什么都没留下…
展开
-
算法模板之最近公共祖先问题(LCA)
poj1330最近公共祖先问题模板:#include#include#include#include#include#include#include#include#define N 30000using 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 · 303 阅读 · 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 · 277 阅读 · 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 · 376 阅读 · 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 · 296 阅读 · 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 · 221 阅读 · 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 · 192 阅读 · 0 评论 -
算法模板之欧拉函数
欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.对φ(N)的值,我们可以通俗地理解为小于N且与N互质的数的个数(包含1).下面两种方法求欧拉函数值,一种直接算出来的,另一种是通过筛选得来的。#define N 5000000+10typedef unsigned long long ll;ll Euler[N];ll init(int n)//根据定义直接算{原创 2017-08-21 17:33:19 · 234 阅读 · 0 评论 -
算法模板之次短路
给你N个点和R条边,问从起点到终点的次短路是多少。无向边,且可重复走。#include #include #include #include #define MAXN 100009#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;struct edge{ int to, cost;原创 2017-08-24 15:20:07 · 795 阅读 · 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 · 230 阅读 · 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 · 220 阅读 · 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 · 218 阅读 · 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 · 266 阅读 · 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 · 1517 阅读 · 0 评论