算法基础模板
兴安仓鼠
LEARN BY DOING!
展开
-
模板题——搜索
1.基本DFS#include <bits/stdc++.h>using namespace std;int n;int path[10];//记录每个位置上的数字是几int st[10];void dfs(int u)//u表示当前层数{ if(u==n)//u恰好走到最后一层 { for(int i=0;i<n;i++) printf("%d ",path[i]); puts(""); return;原创 2021-02-12 13:47:22 · 173 阅读 · 1 评论 -
模板题——贪心(2)
1.合并果子【哈夫曼树】#include <bits/stdc++.h>using namespace std;int n;int main(){ cin>>n; priority_queue<int, vector<int >,greater<int> >heap; int x; while(n--) { cin>>x; heap.push(x);原创 2021-02-04 12:13:01 · 134 阅读 · 0 评论 -
模板题——贪心(1)
1.区间选点和最大不相交区间数量【妙啊】#include <bits/stdc++.h>using namespace std;const int N=100010;int n;struct Range{ int l,r; bool operator<(const Range &W) const//结构体内重载 { return r<W.r; }}range[N];int main(){ scanf(原创 2021-02-03 13:50:14 · 125 阅读 · 0 评论 -
模板题——数位DP、状态压缩、记忆化搜索
1.整数的划分完全背包解法状态表示:f[i][j]表示只从1~i中选,且总和等于j的方案数状态转移方程:f[i][j] = f[i - 1][j] + f[i][j - i]#include <bits/stdc++.h>using namespace std;const int N=1010,mod=1e9+7;int n;int f[N];int main(){ cin>>n; f[0]=1; for(int i=1;i<=n;原创 2021-02-03 10:58:33 · 159 阅读 · 0 评论 -
模板题——线性DP基础+区间DP
1.数字三角形【由下到上】#include <bits/stdc++.h>using namespace std;const int N=505;int n;int f[N][N],a[N][N];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&a[i][j]); for(int原创 2021-02-01 15:32:01 · 206 阅读 · 0 评论 -
模板题——背包问题
1.01背包思路分析状态表示:f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少答案是:result=max{f[n][0~v]}状态转移:f[i][j]1.不选第i个 f[i][j]=f[i-1][j]2.选第i个 f[i][j]=f[i-1][j-v[i]]初始化:f[0][0]=0f[i][j]=max(1.2.)朴素代码#include <bits/stdc++.h>using namespace std;const int N=1010;原创 2021-01-31 14:28:06 · 187 阅读 · 0 评论 -
模板题——容斥原理、博弈论
1.容斥原理#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=20;int p[N];int main(){ int n,m; cin>>n>>m; for(int i=0;i<m;i++) cin>>p[i]; int res=0; for(int i=1;i<1<<m;i++原创 2021-01-30 13:57:39 · 161 阅读 · 1 评论 -
模板题——中国剩余定理,求组合数,卡特兰数
1.中国剩余定理(还没太理解推导过程(lll¬ω¬)):拓展欧几里得算法与反复迭代#include <bits/stdc++.h>using namespace std;typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y){ if(!b) { x=1,y=0; return a; } ll d=exgcd(b,a%b,y,x); y-=a/b*x原创 2021-01-29 14:14:12 · 173 阅读 · 0 评论 -
模板题——快速幂,高斯消元
1.快速幂模板#include <bits/stdc++.h>using namespace std;typedef long long ll;int qmi(int a,int k,int p){ int res=1; while(k) { if(k&1) res=(ll) res*a%p; k>>=1; a=(ll)a*a%p; } return r原创 2021-01-28 14:01:48 · 154 阅读 · 0 评论 -
模板题——质数、素数、约数
1.试除法判断质数:O(sqrt(n))#include <bits/stdc++.h>using namespace std;bool is_prime(int n){ if(n<=1) return false; for(int i=2;i<=n/i;i++) if(n%i==0) return false; return true;}int main(){ int n; cin>>n;原创 2021-01-27 15:45:27 · 148 阅读 · 0 评论 -
模板题——图论相关(2)
1.Floyd求最短路#include <bits/stdc++.h>using namespace std;const int N=210,INF=1e9;int n,m,q;int d[N][N];//邻接矩阵void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=min(d[i][j],d[原创 2021-01-26 14:30:19 · 148 阅读 · 0 评论 -
模板题——图论相关(1)
1.广搜:输出1号点到n号点的最短距离#include <bits/stdc++.h>using namespace std;const int N=100010;int h[N],e[N],ne[N],idx;int d[N];int m,n;void add(int a,int b){ e[idx]=b;ne[idx]=h[a];h[a]=idx++;}int bfs(){ queue<int >q; memset(d,-1,siz原创 2021-01-25 14:06:56 · 119 阅读 · 0 评论 -
蛇形矩阵
1.纯手写#include <bits/stdc++.h>using namespace std;const int N=110;int main(){ int m,n,a[N][N],sum=1; cin>>n>>m; int i,j,k; for(k=1; k<=floor(min(n,m)/2); k++) { for(j=k; j<=m-k+1; j++) {原创 2021-01-22 15:04:09 · 106 阅读 · 0 评论 -
模板题——堆排序 哈希表 字符串哈希
1.堆排序#include <bits/stdc++.h>using namespace std;const int N=100010;int n,m;int h[N],sizee;void down(int u){ int t=u; if(u*2<=sizee&&h[u*2]<h[t]) t=u*2; if(u*2+1<=sizee&&h[u*2+1]<h[t]) t=u*2+1; if(原创 2021-01-21 14:56:50 · 147 阅读 · 0 评论 -
模板题——KMP Trie树 并查集
1.KMP算法模板#include <bits/stdc++.h>using namespace std;const int N=100010,M=1000010;char p[N],s[M];int ne[N];int main(){ int m,n; cin>>n>>p+1>>m>>s+1; for(int i=2,j=0;i<=n;i++) { while(j&&a原创 2021-01-21 10:45:53 · 194 阅读 · 0 评论 -
模板题——单链表双链表,数组模拟的栈和队列,单调栈和单调队列
1.单链表【数组模拟链式存储结构】#include <bits/stdc++.h>using namespace std;const int N=100010;int e[N],ne[N];int head,idx;void init(){ head=-1;//头指针 idx=0;//当前空指针}void add_to_head(int x){ e[idx]=x; ne[idx]=head; head=idx; idx++;原创 2021-01-20 15:01:30 · 152 阅读 · 0 评论 -
模板题——位运算,离散化,区间合并
1.位运算模板:#include <bits/stdc++.h>using namespace std;const int N = 100010;//lowbit函数作用:返回x的最后一位1int lowbit(int x){ return x & (-x);}int main(){ int n; cin >> n; while(n --) { int a; cin>>a; int原创 2021-01-20 14:57:39 · 117 阅读 · 1 评论 -
模板题——高精度
1.加法#include <bits/stdc++.h>using namespace std;vector<int> add(vector<int>&a, vector<int >&b){ vector<int> c; int t=0; for(int i=0;i<a.size()||i<b.size();i++) { if(i<a.size()) t+=原创 2021-01-17 14:49:26 · 137 阅读 · 0 评论 -
模板题——前缀和与差分
1.前缀和#include <bits/stdc++.h>using namespace std;const int N=100005;int a[N],s[N];int main(){ s[0]=0; int n,m,l,r; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) s[i]=a原创 2021-01-17 14:47:40 · 166 阅读 · 0 评论 -
模板题——快排、归并、二分
1.快速排序模板#include <bits/stdc++.h>using namespace std;const int N = 1000010;int q[N];void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[(l+r)/2]; while (i < j) { do i ++原创 2021-01-16 13:40:23 · 134 阅读 · 0 评论