
算法进阶指南
巴扎嘿呀
学习知识图谱中~欢迎交流
展开
-
噩梦(双向bfs)
#include <bits/stdc++.h>#define ll long longconst int maxn = 1010;using namespace std;int dx[8]={0,0,1,-1,1,1,-1,-1};int dy[8]={1,-1,0,0,1,-1,1,-1};bool visited[2][maxn][maxn];char maps[maxn][maxn];int n,m;int res,zz;struct point{ int .原创 2021-02-09 04:01:46 · 528 阅读 · 0 评论 -
计算系数(组合数)
#include <iostream>#include <algorithm>using namespace std;const int mod = 10007;int qmi(int a,int k){ a%=mod; int res=1; while(k){ if(k&1) res=res*a%mod; a=a*a%mod; k>>=1; } return re.原创 2021-02-09 03:04:07 · 1003 阅读 · 0 评论 -
反素数(dfs)
#include<bits/stdc++.h>#define ll long longusing namespace std;ll n;ll ans1=0,ans2=1e18;ll primes[10]={2,3,5,7,11,13,17,19,23,29};void dfs(int u,int pre,ll sum,ll num){ if((num>ans1)||(num==ans1&&sum<ans2)){ ans1=num; ans2=s.原创 2021-02-09 03:03:01 · 255 阅读 · 0 评论 -
绿豆蛙的归宿(数学期望)
#include<bits/stdc++.h>using namespace std;const int N=1e5+100;int h[N],e[2*N],w[2*N],ne[2*N],idx;int deg[N],out[N];double f[N];queue<int> q;void add(int a,int b,int c){ e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}int main(){ memset(.原创 2020-12-28 15:59:44 · 121 阅读 · 0 评论 -
开关问题(高斯消元)
#include<bits/stdc++.h>using namespace std;const int N=110;int a[N];int x,y;int main(){ int T;scanf("%d",&T); while(T--){ int n;scanf("%d",&n); //构建增广矩阵 for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1,j;i<=n;i+.原创 2020-12-28 15:29:28 · 118 阅读 · 1 评论 -
球形空间产生器(高斯消元)
#include<bits/stdc++.h>using namespace std;const int N=20;double a[N][N],b[N],c[N][N];int main(){ int n;scanf("%d",&n); for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]); //构建增广矩阵 for(int i=1;i<=n;i++) .原创 2020-12-28 15:12:46 · 167 阅读 · 0 评论 -
旅行(线性dp+LCS路径)
#include<bits/stdc++.h>using namespace std;const int N=100;int f[N][N];int last_a[N][26];int last_b[N][26]; char s1[N],s2[N];vector<string> v;void dfs(int a,int b,int len,string s){ if(len==0){ v.push_back(s); return ; } if(!a||.原创 2020-12-18 16:32:25 · 132 阅读 · 1 评论 -
战略游戏(树形dp)
#include<bits/stdc++.h>using namespace std;const int N=1510;int n;int f[N][2];bool st[N];int h[N],ne[N],e[N],idx;void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}void dp(int x){ f[x][1]=1; f[x][0]=0; for(int i=h[x];i!=-1;i=ne[i].原创 2020-12-18 14:54:13 · 146 阅读 · 0 评论 -
能量项链(区间dp+环形拆链)
#include<bits/stdc++.h>using namespace std;const int N=110;int f[2*N][2*N];int tou[2*N];int wei[2*N];int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ int x;scanf("%d",&x); tou[i]=x;tou[i+n]=x; if(i>1){ if(i!=n).原创 2020-12-18 11:44:05 · 132 阅读 · 0 评论 -
低买(线性dp+LIS方案数)
#include<bits/stdc++.h>using namespace std;const int N=5050;int a[N];int f[N];int num[N];int main(){ int ans=0; int n;scanf("%d",&n); for(int i=1;i<=n;i++) f[i]=1; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n.原创 2020-12-18 11:27:34 · 134 阅读 · 0 评论 -
花店橱窗(线性dp)
#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=110;int dp[N][N];int a[N][N];int ans[N];int main(){ int n,m;scanf("%d%d",&m,&n); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ scanf("%d",&a[i.原创 2020-12-17 22:01:50 · 268 阅读 · 0 评论 -
乌龟棋(线性dp)
#include<bits/stdc++.h>using namespace std;const int N=40;int f[N][N][N][N];int a[360];int x[5];int num(int i,int j,int k,int z){ return i*1+j*2+k*3+z*4;} int main(){ int n,m;scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d".原创 2020-12-17 09:22:45 · 115 阅读 · 0 评论 -
围栏(单调队列优化dp)
#include<bits/stdc++.h>using namespace std;const int N=16010;const int M=110;struct P{ int l,p,s;}a[M];int q[N];int f[M][N];int calc(int i,int k){ return f[i-1][k]-a[i].p*k;}bool cmp(P x,P y){ return x.s<y.s;}int main(){ int n,m;s.原创 2020-12-17 08:37:06 · 152 阅读 · 0 评论 -
环路运输(单调队列)
#include<bits/stdc++.h>using namespace std;const int N=1e6+100;int a[N];int q[N];int l=1,r=0;int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); a[i+n]=a[i]; } int ans=0,len=n/2; for(int i=1;i<=2*.原创 2020-12-16 23:07:36 · 172 阅读 · 0 评论 -
休息时间 (环形结构二次dp)
#include<bits/stdc++.h>using namespace std;const int N=4000;int f[2][N][2];int g[2][N][2];int v[N];int main(){ memset(f,-0x3f,sizeof f); memset(g,-0x3f,sizeof g); int n,b;scanf("%d%d",&n,&b); for(int i=1;i<=n;i++) scanf("%d",&am.原创 2020-12-16 18:37:54 · 192 阅读 · 0 评论 -
金字塔(区间dp+记忆化搜索)
#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=510;const int mod=1e9;string s;int f[N][N];ll dp(int l,int r){ if(l>r) return 0; if(l==r) return f[l][r]=1; if(f[l][r]!=-1) return f[l][r]; f[l][r]=.原创 2020-12-14 16:10:29 · 158 阅读 · 0 评论 -
多边形 (区间dp)
#include<bits/stdc++.h>using namespace std;const int N=55;int a[2*N];char b[2*N];int fmx[2*N][2*N];int fmn[2*N][2*N];int main(){ int n;scanf("%d",&n); for(int i=1;i<=2*n;i++){ if(i&1){ char c;cin>>.原创 2020-12-14 15:30:39 · 172 阅读 · 1 评论 -
陪审团(多维背包)
#include<bits/stdc++.h>using namespace std;const int base=400;const int N=210;const int M=25;int f[N][M][1000];int p[N],d[N];int main(){ int n,m; scanf("%d%d",&n,&m); int T=0; while(n!=0&&m!=0){ memset(f,-0x3f,sizeof f);.原创 2020-12-06 23:58:28 · 200 阅读 · 0 评论 -
自然数拆分(完全背包)
#include<bits/stdc++.h>#define ll long longusing namespace std;const ll mod=2147483648;const int N=4010;ll f[N];int main(){ int n;scanf("%d",&n); f[0]=1; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ f[j]=(f[j]+f[j-i])%mod; .原创 2020-12-06 20:55:29 · 125 阅读 · 0 评论 -
质数距离
#include<bits/stdc++.h>#define ll long long using namespace std;const int N=1e6+10;bool st[N];bool stt[N];int primes[N];int cnt=0;void getprime(int x){ for(int i=2;i<=x;i++){ if(!st[i]) primes[cnt++]=i; for(int j=0;primes[j]<=x/i;.原创 2020-12-05 17:52:08 · 135 阅读 · 0 评论 -
传纸条(线性dp)
#include<bits/stdc++.h>using namespace std;const int N=55;int f[2*N][N][N];int a[N][N];int dx[3]={1,0};int dy[3]={0,1};int main(){ int n,m;scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a.原创 2020-12-05 11:44:02 · 180 阅读 · 1 评论 -
小猫爬山(dfs)
#include<bits/stdc++.h>using namespace std;const int N=20;int a[N];int n,w;int ans;int num[N];int cnt;void dfs(int now){ if(cnt>=ans) return ; if(now==n){ ans=min(ans,cnt); return ; } for(int i=0;i<cnt;i++){ if(num[i]+a[now]&.原创 2020-11-22 11:43:25 · 183 阅读 · 0 评论 -
荷马史诗(k叉Huffman树)
#include<bits/stdc++.h>#define ll long longusing namespace std;typedef pair<ll,int> PII;const int N=1e5+100;ll w[N];int main(){ priority_queue<PII,vector<PII>,greater<PII> >q; int n,k;scanf("%d%d",&n,&k); for.原创 2020-11-21 11:46:41 · 178 阅读 · 0 评论 -
序列(结构体二叉堆)
#include<bits/stdc++.h>using namespace std;const int N=2010;int a[N],b[N],c[N];int n,m;map<pair<int,int>,bool> st;struct P{ int x,y; bool operator < (const P & t) const{ return a[x]+b[y]>a[t.x]+b[t.y]; }};void solv.原创 2020-11-21 11:00:13 · 131 阅读 · 0 评论 -
超市(二叉堆)
#include<bits/stdc++.h>using namespace std;const int N=1e4+10;struct P{ int p,d;}a[N];bool cmp(P x,P y){ return x.d<y.d;}int main(){ int n; while(cin>>n){ priority_queue<int,vector<int>,greater<int> >q; for(.原创 2020-11-21 10:12:31 · 105 阅读 · 0 评论 -
最长异或值路径(Trie)
#include<bits/stdc++.h>using namespace std;const int N=1e5+10;const int M=5e6+10;int trie[M][2];int cnt=1;int ans=0;int d[N];bool st[N];int h[N],ne[2*N],e[2*N],w[2*N],idx;void add(int a,int b,int v){ e[idx]=b,w[idx]=v,ne[idx]=h[a],h[a]=id.原创 2020-11-20 22:30:25 · 133 阅读 · 0 评论 -
最大异或对(Trie)
#include<bits/stdc++.h>using namespace std;const int N=4e6+10;int a[N];int trie[N][2];int cnt=1;int ans=0;void insert(int x){ int p=1,t; int T=31; vector<int> v; while(T--){ v.push_back(x&1); x>>=1; } reverse(v.begin.原创 2020-11-20 20:48:47 · 115 阅读 · 0 评论 -
前缀统计(Trie)
#include<bits/stdc++.h>using namespace std;const int N=1e6+10;char s[N];int trie[N][26],cnt=1;int num[N];void insert(char* str){ int len=strlen(str),p=1; for(int i=0;i<len;i++){ int son=str[i]-'a'; if(trie[p][son]==0) trie[p][son]=++c.原创 2020-11-19 17:19:19 · 287 阅读 · 0 评论 -
直方图中最大的矩形(单调栈)
#include<bits/stdc++.h>#define ll long longusing namespace std;const int N=1e5+10;int h[N];int s[N];ll w[N];int p;int main(){ int n; while(cin>>n&&n){ p=0; for(int i=1;i<=n;i++) scanf("%d",&h[i]); h[n+1]=0; ll.原创 2020-11-19 14:19:52 · 111 阅读 · 0 评论 -
银河英雄传说(带边权并查集)
#include<bits/stdc++.h>using namespace std;const int N=3e4+100;const int M=5e5+100;int siz[N];int d[N];int fa[N];int find(int x){ if(fa[x]==x) return x; int root=find(fa[x]); d[x]+=d[fa[x]]; return fa[x]=root;}int main(){ for(int i=1;i.原创 2020-11-12 19:45:44 · 117 阅读 · 0 评论 -
骑士放置(二分图最大独立集)
#include<bits/stdc++.h>using namespace std;const int N=150;bool st[N*N];int match[N*N]; bool mp[N][N];int dx[8]={-2,-2,2,2,-1,-1,1,1};int dy[8]={-1,1,-1,1,-2,2,-2,2};int h[N*N],ne[8*N*N],e[8*N*N],idx;void add(int a,int b){ e[idx]=b,ne[idx].原创 2020-11-11 12:46:06 · 113 阅读 · 0 评论 -
泥泞的区域(二分图最小点覆盖)
#include<bits/stdc++.h>using namespace std;const int N=55;char g[N][N];int h[N*N],ne[N*N],e[N*N],idx;int t1,t2;int match[N*N];bool st[N*N];int num1[N][N],num2[N][N];void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}bool dfs(int u).原创 2020-11-11 11:42:01 · 145 阅读 · 0 评论 -
机器任务(二分图最小点覆盖)
模式0对答案没有贡献,因为机器刚开始就处于模式0#include<bits/stdc++.h>using namespace std;const int N=110;const int M=1010;int h[N],ne[M],e[M],idx;bool st[N];int match[N];int n,m;void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}bool dfs(int u){ for(.原创 2020-11-11 11:12:24 · 96 阅读 · 0 评论 -
棋盘覆盖(二分图最大匹配)
#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=10010;int n,m;int match[N];bool st[N];int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};//map<pair<int,int>,bool> mp;bool mp[N][N];int h[N],ne[4*N],e[4*N],i.原创 2020-11-11 10:39:38 · 181 阅读 · 1 评论 -
关押罪犯(二分答案+染色法判二分图)
#include<bits/stdc++.h>using namespace std;const int N=2e4+100;const int M=2e5+100;int h[N],v[M],ne[M],e[M],idx;int n,m;int color[N];void add(int a,int b,int c){ v[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;}bool dfs(int u,int col,int rr){ c.原创 2020-11-10 23:58:31 · 733 阅读 · 0 评论 -
移动服务(线性dp)
#include<bits/stdc++.h>using namespace std;const int N=210;int g[N][N];int p[1010];int dp[1010][N][N];int main(){ int l,n;scanf("%d%d",&l,&n); for(int i=1;i<=l;i++) for(int j=1;j<=l;j++) scanf("%d",&g[i][j]); for(int .原创 2020-11-10 09:54:50 · 149 阅读 · 0 评论 -
巡逻(树的直径 树形dp+两次dfs)
#include<bits/stdc++.h>using namespace std;const int N=1e5+100;int h[N],e[2*N],ne[2*N],v[2*N],idx;int dis[N];int pre[N];bool st[N];int d[N];int ans=0;int n,k;int p;void add(int a,int b){ v[idx]=1,e[idx]=b,ne[idx]=h[a],h[a]=idx++;}void .原创 2020-11-10 00:13:14 · 127 阅读 · 0 评论 -
可达性统计(拓扑排序+bitset)
#include<bits/stdc++.h>using namespace std;const int N=30010;bitset<N> b[N];int n,m;int deg[N];int h[N],e[2*N],ne[2*N],idx;void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}vector<int> top(){ vector<int> res; que.原创 2020-11-09 18:05:51 · 148 阅读 · 0 评论 -
分级(线性dp+前缀优化)
#include<bits/stdc++.h>using namespace std;const int INF=0x3f3f3f3f;const int N=2010;int a[N];int n;int b[N];int dp[N][N];int solve(){ for(int i=1;i<=n;i++) b[i]=a[i]; sort(b+1,b+1+n); for(int i=1;i<=n;i++){ int mn=INF; for(int .原创 2020-11-09 17:29:02 · 198 阅读 · 0 评论 -
最长公共上升子序列(线性dp)
#include<bits/stdc++.h>using namespace std;const int N=3010;int a[N],b[N];int dp[N][N];int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); for(int i=1;i<=n.原创 2020-11-09 16:44:07 · 82 阅读 · 0 评论