acm算法模板2.docx
- 文档编号:5753794
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:207
- 大小:75.47KB
acm算法模板2.docx
《acm算法模板2.docx》由会员分享,可在线阅读,更多相关《acm算法模板2.docx(207页珍藏版)》请在冰豆网上搜索。
acm算法模板2
算法模板2
矩阵乘法3
domino多米诺骨牌取0到0~n的状态。
。
3
pku3233S=A+A2+A3+…+Ak.4
pku2778不含疾病基因的长度为n的的基因总数5
voj10498
Voj10679
高斯削元10
Ural01高斯消元10
01转换为mod212
pku3532实数高斯消元14
Hdu2408整系数线性方程组的整数解(高斯消元)16
hdu2449分数高斯消元(高精度)18
动态规划21
状态压缩21
pku1038一个有限制的矩形用2*3覆盖,最多能覆盖多少块。
(三进制)21
pku241111*11的格子用1*2铺满23
pku1185炮兵阵地24
pku2430两列n行一堆牛。
。
25
pku2288besttriangularHamilton27
pku2285放积木,要求放满29
hrb5085放积木,积木不能旋转(注意长宽方向),求最多铺的面积32
树型dp34
题目类型总结34
pku1463树的最小点覆盖34
pku3342树的最大独立点集35
pku3398树的节点只与一个server相连。
。
37
pku1947删最少的边得到一个含p个节点的子树(dfs降维)39
pku3140m是骗人的。
。
树分成两半,节点权和差最小40
tsoi3_4所有点间距离的平均值42
pku1155在权值非负的情况下包括尽量多的叶子节点(dfs降维)43
pku1155dfs降维45
pku2486appletree两种状态互相推导(go,back)46
pku3345(hdu2415)贿选。
。
47
拓扑序dp50
Hdu2437Jerboas有向无环图单起点多终点路线为K的倍数地最短的路线长度50
Hdu2452Navymaneuvers有向无环图,两个船长轮流领航52
四边形不等式54
一般性结论54
石子合并54
pku1160有n个村子要建p个邮局55
单调队列56
题目类型总结56
pku2823求数列中定长区间的最大最小值57
hdu2430预处理g[x]=i表示s[i]%p==x的第一个i58
noi05_adv190060
pku2373f[i]=max(f[i-2*b]..f[i-2*a])+162
zoj3031邮件分发63
pku1821n个工人刷长为m的墙64
平衡二叉树65
pku1765算每个屋檐的降雨量,扫除线+treap65
静态平衡二叉树hrb508668
Pku235271
pku33785维逆序对72
归并排序74
Hrb5085树状数组78
pku3321AppleTree欧拉序列+树状数组79
线段树81
题目类型总结81
线段树总结81
Pku3225集合操作线段树翻转82
pku1769线段树+dp(动态查询修改某一区间的信息)86
Hdu2430线段树dp询问长度为k的区间中的最小值。
87
Netflow88
网络流题目类型总结:
88
pku3680dinic+消圈89
07beijing_H94
Pku3469构图(关键),求最小98
Pku3204求割边。
。
100
Hdu2435求最小割,再在残余网络中求最大流103
Pku3155最大密度子图(?
)107
二分图匹配111
最大匹配111
Dfs111
Hrb508701染色判奇环,二分图最大匹配112
Pku3692最大完全子图114
最优匹配116
zju3035KM116
Zju3035bylzx118
连通性121
(强连通)Pku1236121
(单向连通)pku2762124
求桥127
Pku1438在保证图仍然为强连通的前提下,把尽量多的双向边改为单向边127
Pku3177无向图求二连通子图128
2sat130
一般性结论:
130
PKU2723二分+2-sat验证,131
pku3683n个婚礼问能否全部举行,要求构造解134
lca139
字符串处理143
后缀数组模板143
后缀树pku1743乐谱最长的相似(差值相同)的乐章的长度145
后缀树+后缀数组pku3693最大重复(连续重复次数最多)子序列150
dfapku3691有穷状态自动机157
矩阵乘法
domino多米诺骨牌取0到0~n的状态。
。
#include
usingnamespacestd;
constintmaxn=32;
intm,mod;
intf[maxn][maxn],g[maxn][maxn],d[maxn][maxn];
voiddfs(intd,inta,intb){
if(d==m){g[a][b]=1;return;}
if(a&(1< else{ dfs(d+1,a,b|(1< if((d (a&(1<<(d+1))))dfs(d+2,a,b); } } voidmul(intn,intc[maxn][maxn],inta[maxn][maxn],intb[maxn][maxn]){ inti,j,k; memset(d,0,sizeof(d)); for(i=0;i for(j=0;j for(k=0;k d[i][j]=(d[i][j]+a[i][k]*b[k][j])%mod; memcpy(c,d,sizeof(d)); } intmain(){ intn,i; cin>>n>>m>>mod; memset(g,0,sizeof(g)); for(i=0;i<(1< memset(f,0,sizeof(f)); for(i=0;i<(1< f[0][0]=1; while(n>0){ if(n&1)mul(1< mul(1< n>>=1; } cout< return0; } pku3233S=A+A2+A3+…+Ak. #include usingnamespacestd; constintmaxn=100; intmod; intg[maxn][maxn],f[maxn][maxn]; intn; voidmul(intc[maxn][maxn],inta[maxn][maxn],intb[maxn][maxn]){ inti,j,k; intt[maxn][maxn]; for(i=1;i<=2*n;i++) for(j=1;j<=2*n;j++){ t[i][j]=0; for(k=1;k<=2*n;k++) t[i][j]=(t[i][j]+a[i][k]*b[k][j])%mod; } memcpy(c,t,sizeof(t)); } intmain(){ intk,i,j; cin>>n>>k>>mod; memset(g,0,sizeof(g)); for(i=1;i<=n;i++) for(j=1;j<=n;j++){ scanf("%d",&g[i][j]); g[i][j+n]=g[i][j]; } for(i=1;i<=n;i++)g[i+n][i+n]=1; for(i=1;i<=2*n;i++)f[i][i]=1; while(k>0){ if(k&1)mul(f,f,g); mul(g,g,g); k>>=1; } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("%d",f[i][j+n]); printf("\n"); } return0; } pku2778不含疾病基因的长度为n的的基因总数 #include usingnamespacestd; constintmaxn=200+100; constintmod=100000; structtrienode{ intcount,i,f,dep,sta; charc; boolfinal; intchild[6]; }; trienodetrie[maxn]; charF[20][20]; intsac[maxn]; intf[101][101],g[101][101],tp[101][101]; intsize,n,m,stas; intgetnum(charc){ if(c=='A')return0; if(c=='C')return1; if(c=='G')return2; if(c=='T')return3; return-100000; } voidinsert(int&i,intf,intp,intdep,char*s){ if(i==0){ i=++size; trie[i].dep=dep; trie[i].f=f; trie[i].c=s[-1]; } if(s[0]==0){ trie[i].count++; trie[i].i=p; trie[i].final=true; } elseinsert(trie[i].child[getnum(s[0])],i,p,dep+1,s+1); } intque[maxn]; voidbuild_ac(introot){ inti,f,d,l,r,j; charc; sac[root]=root; trie[root].f=root; l=0;r=1; que[1]=root; while(l i=que[++l]; for(j=0;j<4;j++) if(trie[i].child[j]>0)que[++r]=trie[i].child[j]; f=trie[i].f; if(f==root)sac[i]=root; else{ d=sac[f]; c=trie[i].c; while(d! =root&&trie[d].child[getnum(c)]==0) d=sac[d]; if(trie[d].child[getnum(c)]! =0){ sac[i]=trie[d].child[getnum(c)]; if(trie[sac[i]].final)trie[i].final=true; } elsesac[i]=root; } if(! trie[i].final)trie[i].sta=++stas; } } voidmul(intg[101][101],intf[101][101]){ inti,j,k; memset(tp,0,sizeof(tp)); for(i=1;i<=stas;i++) for(j=1;j<=stas;j++) for(k=1;k<=stas;k++) tp[i][j]=(tp[i][j]+(longlong)g[i][k]*f[k][j])%mod; memcpy(g,tp,sizeof(tp)); } intmain(){ introot,i,j,k,ans; root=size=1; stas=0; cin>>m>>n; memset(trie,0,sizeof(trie)); for(i=1;i<=m;i++){ scanf("%s",F[i]+1); insert(root,0,i,0,F[i]+1); } memset(sac,0,sizeof(sac)); build_ac(root); memset(f,0,sizeof(f)); for(i=1;i<=size;i++) if(! trie[i].final) for(j=0;j<4;j++){ k=i; while(k! =root&&trie[k].child[j]==0)k=sac[k]; if(trie[k].child[j]==0)f[trie[i].sta][trie[root].sta]++; else{ k=trie[k].child[j]; if(! trie[k].final)f[trie[i].sta][trie[k].sta]++; } } memset(g,0,sizeof(g)); for(i=1;i<=stas;i++)g[i][i]=1; while(n>0){ if(n&1)mul(g,f); mul(f,f); n>>=1; } ans=0; for(i=1;i<=stas;i++) ans=(ans+g[1][i])%mod; cout< return0; } voj1049题目大意: 顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。 m<=10,k<2^31。 #include usingnamespacestd; constintmaxn=110; constintmaxm=30; intf[maxm][maxn]; inta[maxn],b[maxn],c[maxn]; intmain(){ intn,m,k,i,j,x,nn,q; cin>>n>>m>>k; memset(f,0,sizeof(f)); for(i=1;i<=n;i++)f[0][i]=i; for(i=1;i<=m;i++) for(j=1;j<=n;j++){scanf("%d",&x);f[i][j]=f[i-1][x];} memset(a,0,sizeof(a)); for(i=1;i<=n;i++)a[i]=i; memcpy(b,f[m],sizeof(b)); nn=k/m;q=k%m; while(nn>0){ if(nn&1){ for(i=1;i<=n;i++)c[i]=a[b[i]]; memcpy(a,c,sizeof(c)); } for(i=1;i<=n;i++)c[i]=b[b[i]]; memcpy(b,c,sizeof(c)); nn>>=1; } for(i=1;i<=n;i++)c[i]=a[f[q][i]]; memcpy(a,c,sizeof(a)); for(i=1;i<=n;i++){ printf("%d",a[i]); if(i==n)printf("\n");elseprintf(""); } return0; } Voj1067 我们可以用上面的方法二分求出任何一个线性递推式的第n项,其对应矩阵的构造方法为: 在右上角的(n-1)*(n-1)的小矩阵中的主对角线上填1,矩阵第n行填对应的系数,其它地方都填0。 例如,我们可以用下面的矩阵乘法来二分计算f(n)=4f(n-1)-3f(n-2)+2f(n-4)的第k项: 利用矩阵乘法求解线性递推关系的题目我能编出一卡车来。 这里给出的例题是系数全为1的情况。 #include usingnamespacestd; constintmaxn=12; constintmod=7777777; longlongc[maxn][maxn],a[maxn][maxn],d[maxn][maxn]; longlongf[maxn]; voidmul(intn,longlongc[maxn][maxn],longlonga[maxn][maxn],longlongb[maxn][maxn]){ inti,j,k; memset(d,0,sizeof(d)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) d[i][j]=(d[i][j]+a[i][k]*b[k][j])%mod; memcpy(c,d,sizeof(d)); } intmain(){ intn,k,i,j; longlongans; cin>>k>>n; f[0]=1; for(i=1;i<=k;i++){ f[i]=0; for(j=0;j } if(n<=k)cout< else{ n=n-k; memset(c,0,sizeof(c)); for(i=1;i<=k;i++)c[i][i]=1; memset(a,0,sizeof(a)); for(i=1;i for(i=1;i<=k;i++)a[k][i]=1; while(n>0){ if(n&1)mul(k,c,c,a); mul(k,a,a,a); n>>=1; } ans=0; for(i=1;i<=k;i++)ans=(ans+c[k][i]*f[i])%mod; cout< } return0; } 高斯削元 Ural01高斯消元 #include usingnamespacestd; constintmaxn=260; boolans[maxn],any[maxn],t[maxn][maxn]; intn; intsearch(ints){ inti; for(i=s+1;i<=n;i++) if(t[i][s])returni; return0; } voidinit(){ inti,j; cin>>n; memset(t,0,sizeof(t)); memset(ans,0,sizeof(ans)); memset(any,0,sizeof(any)); for(i=1;i<=n;i++){ while (1){ scanf("%d",&j); if(j==-1)break; t[j][i]=true; } } for(i=1;i<=n;i++) t[i][n+1]=true; } voidgauss(){ inti,j,k,s; boolx; for(i=1;i { if(! t[i][i]){ s=search(i); if(s==0){any[i]=true;continue;} for(j=i;j<=n+1;j++){x=t[i][j];t[i][j]=t[s][j];t[s][j]=x;} } for(j=i+1;j<=n;j++) if(t[j][i]){ for(k=i+1;k<=n+1;k++) t[j][k]^=t[i][k]; t[j][i]=false; } } if(! t[n][n]) if(! t[n][n+1])any[n]=true;else{cout<<"Nosolution"< for(i=n;i>=1;i--) if(any[i])ans[i]=false; else{ x=t[i][n+1]; for(j=i+1;j<=n;j++) x^=(t[i][j]&ans[j]); ans[i]=x; } for(i=1;i<=n;i++) if(ans[i])printf("%d",i); cout< } intmain(){ //freopen("heat.in","r",stdin); //freopen("heat.out","w",stdout); init(); gauss(); return0; } 01转换为mod2 #include usingnamespacestd; constintmaxn=260; constintmod=2; inta[maxn][maxn]; boolany[maxn],ans[maxn]; intn; intsearch(ints){ inti; for(i=s+1;i<=n;i++) if(a[i][s]! =0)returni; return0; } voidinit(){ inti,j; cin>>n; memset(a,0,sizeof(a)); memset(ans,0,sizeof(ans)); memset(any,0,sizeof(any)); for(i=1;i<=n;i++){ while (1){ scanf("%d",&j); if(j==-1)break; a[j][i]=1; } } for(i=1;i<=n;i++) a[i][n+1]=1; } voidgauss() { inti,j,k,s,x; for(i=1;i<=n;i++) { if(a[i][i]==0){ s=search(i); if(s==0){any[i]=true;c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- acm 算法 模板