![](https://img-blog.csdnimg.cn/20210209182543236.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Acwing 算法提高课
本课程系统讲解常用算法与数据结构的 应用方式与技巧
菱形继承
懒癌患者,IT民工,前进路上经常磕磕碰碰
展开
-
AcWing 1088. 旅行问题(前缀和 单调队列优化dp 破环成链 )
题目链接:1088 旅行问题思路:1.破环成链,加上一倍这是常规操作。2.引用两张图:顺时针,我们可以倒着遍历,为什么呢,是因为我们可以在倒着遍历的时候处理到后n个的窗口最小值,然后遍历到前n个的时候我们就可以将第i个和窗口最值比较,只要比这个最值小就可以保证环绕一圈逆时针,注意到有几个不同:1.首先i点是当前点油量减去到前一个点的距离,那么这里就要考虑到第一个点,就是第n个点到下一个点(第一个点)的距离2.其实本质是一样的,那么我们就要正着处理,处理到后n个就处理完了前n给的窗口最小原创 2021-10-13 00:07:22 · 411 阅读 · 0 评论 -
2021-10-10-Acwin1087. 修剪草坪(单调队列优化dp)
题目链接:https://www.acwing.com/problem/content/1089/思路见下图:代码:#include<iostream>using namespace std;#define int long longconst int N=1e5+10;int f[N],n,k,s[N];int q[N];int g(int i){ if(!i)return 0; return f[i-1]-s[i];}signed main(){原创 2021-10-10 20:13:27 · 281 阅读 · 0 评论 -
AcWing 300. 任务安排1( 前缀和 dp优化)
思路:代码:#include<iostream>#include<limits.h>#include<cstring>#define int long longusing namespace std;const int N=5010;int n,f[N],sumt[N],sumc[N],s;//f[i][j]=f[k][j-1]+(t[1]+...+t[i]+j*s)*(c[k+1]+...+c[i])signed main(){ cin&.原创 2021-10-07 13:44:45 · 153 阅读 · 0 评论 -
AcWing 631. Googol字符串 (递归、思维题)
原题链接对于每个字符串,分为三个部分、前中后,中间由最独立的0组成,前面一直继承下来不变,后面记录一个反转对应的位置以及将本位上的值翻转的次数(0变1,1变0)#include <bits/stdc++.h>using namespace std;#define int long longint t,k,res;void dfs(int k,int p,int cnt){ if(k==(p+1)/2){ res=0; for(int原创 2021-05-23 15:43:10 · 156 阅读 · 0 评论 -
AcWing 12. 背包问题求具体方案(背包求方案数经典模板,一定要会)
#include<bits/stdc++.h>using namespace std;const int N=1010;int n,m,f[N][N],v[N],w[N];int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>v[i]>>w[i]; } for(int i=n;i>=1;i--){ for(int...原创 2021-05-11 23:48:23 · 126 阅读 · 0 评论 -
AcWing 11. 背包问题求方案数(背包问题求方案数)
#include<bits/stdc++.h>using namespace std;const int N=1010,mod=1e9+7;int f[N],cnt[N],n,m;signed main(){ cin>>n>>m; for(int i=0;i<=m;i++)cnt[i]=1; int u,v; for(int i=1;i<=n;i++){ cin>>u>>...原创 2021-05-11 22:48:48 · 121 阅读 · 0 评论 -
AcWing 166. 数独(dfs,位运算 剪枝集萃)
#include<bits/stdc++.h>using namespace std;const int N=100,M=9;char s[N];int ma[1<<M],ones[1<<M];int col[M],row[M],cell[3][3];int lb(int x){ return x& -x;}void init(){ for(int i=0;i<M;i++){ col[i]=row[i]=...原创 2021-04-27 17:13:12 · 103 阅读 · 0 评论 -
AcWing 196. 质数距离(二次筛法 区间筛质数)
思路:摘自小呆呆#include<bits/stdc++.h>using namespace std;#define int long longconst int N=5e6+10;bool st[N];int pr[N],cnt;void init(int x){ memset(st,0,sizeof st); for(int i=2;i<=x;i++){ if(!st[i]){ pr[cnt++]=i..原创 2021-04-25 15:54:42 · 130 阅读 · 0 评论 -
AcWing 1074. 二叉苹果树(树形dp)
状态表示f[u][j]:表示所有以u为树根的子树中选,选j条边的最大价值状态计算每一棵子树看出一组背包,若需要选择该子树son,则根结点u到子树son的边一定用上,因此能用上的总边数一定减1,总共可以选择j条边时,当前子树son分配的最大边数是j - 1,对于任意一棵子树有f[u][j] = max(f[u][j], f[u][j - 1 - k] + f[son][k]+ w[i])#include<bits/stdc++.h>using namespace std;c..原创 2021-04-10 01:01:38 · 82 阅读 · 0 评论 -
AcWing 1072. 树的最长路径(树上路径 模板)
维护以当前节点为根节点的最远距离和次远距离,取两者之和的最大值就是答案#include<bits/stdc++.h>using namespace std;const int N=1e4+10;int e[N<<1],ne[N<<1],idx,h[N],n,ans,w[N<<1];void add(int a,int b,int c){ e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;}int ..原创 2021-04-01 19:55:56 · 95 阅读 · 0 评论 -
AcWing 1064. 小国王(状压dp)
位运算 限制条件只取决于上一行 用二进制表示 上一行为i zheyi原创 2021-04-01 18:40:34 · 140 阅读 · 0 评论 -
AcWing 1275. 最大数(线段树)
#include<bits/stdc++.h>using namespace std;const int N=2e5+10;int m,p,n;struct node{ int l,r,v;}tr[N<<2];void build(int u,int l,int r){ tr[u]={l,r}; if(l==r)return ; int mid=l+r>>1; build(u<<1,l,mid),bui...原创 2021-03-29 00:37:19 · 134 阅读 · 0 评论 -
AcWing 190. 字串变换 (BFS最难版本 双向广搜)
题解:#include<bits/stdc++.h>using namespace std;const int N=110;string A,B;int cnt;string a[N],b[N];int extend(queue<string>&q,unordered_map<string,int>&da,unordered_map<string,int>&db,string a[],string b[]){..原创 2021-03-22 11:49:38 · 152 阅读 · 0 评论 -
AcWing 275. 传纸条 (数字三角形模型变种求两条路径)
大家如果还记得方格取数这道题的话就可以联想起这两者的区别 方格取数也是找两条路径,并且选取完一个点就将其价值置为0,而这道题目就是将价值转换为负无穷就是不能走但其实这两者本质是一样的 所以可以用方格取数题目的代码,四维dp优化三维 枚举四个方向转移至于这两者本质一样的证明(来源):代码:#include<bits/stdc++.h>using namespace std;const int N=60;int w[N][N],n,f[2*N][N][N],m..原创 2021-03-22 00:31:19 · 137 阅读 · 0 评论 -
AcWing 175. 电路维修(双端队列广搜)
思路:#include<bits/stdc++.h>using namespace std;typedef pair<int,int> pii;#define x first#define y secondconst int N=510;int t,r,c;int dist[N][N],st[N][N];char g[N][N];int bfs(){ deque<pii>q; memset(dist,0x3f,siz...原创 2021-03-20 21:39:08 · 161 阅读 · 0 评论 -
AcWing 340. 通信线路(双端队列广搜 二分)
思路:题意求1到N中路径第k+1大的权值的最小值 可以采用二分 然后我们可以利用二分的这个值作为分界线 小于等于这个值 置为0,大于则为1 然后就变成了一个无向图 权0或1的双端队列广搜模型注意此题答案可能为0 并且为判断无解情况我们可以取答案为1e6+1~#include<bits/stdc++.h>using namespace std;const int N=1010,M=2e4+10;int n,p,k,w[M],h[N],ne[M],e[M],idx,dist[..原创 2021-03-20 21:35:52 · 186 阅读 · 0 评论 -
AcWing 1221. 四平方和 (哈希 or 二分 )
思路:这题其实很毒瘤了,因为正常中途相遇法 n方枚举然后哈希一下其实理论上可以过就是因为时间复杂度太高了, 后面还是写了二分才过,好迷啊#include<bits/stdc++.h>using namespace std;typedef pair<int,int> pii;const int N=5e6+10;int n,cnt;struct node{ int val,x,y; bool operator<(const node&..原创 2021-03-20 00:05:07 · 138 阅读 · 0 评论 -
AcWing 1098. 城堡问题(洪水填充)
思路:洪水填充 这道题目的墙一看就知道是二进制拆分,注意洪水填充一进队就要标记~#include<bits/stdc++.h>using namespace std;typedef pair<int,int> pii;#define x first#define y secondconst int N=55;int m,n,g[N][N],area,cnt,st[N][N];int dx[]={0,-1,0,1},dy[]={-1,0,1,0};int ...原创 2021-03-19 19:47:11 · 492 阅读 · 0 评论 -
AcWing 1135. 新年好 (卡spfa 需要用mlogn 的堆优化dij 枚举 )
先预处理 六个点最短路 然后暴力5!枚举即可~注意此题卡spfa 我用双端队列优化都不行#include<bits/stdc++.h>using namespace std;const int N=50010,M=N<<2;typedef pair<int,int> PII;int e[M],idx,w[M],ne[M],h[N],sr[10],dist[10][N],res=0x3f3f3f3f,n,m;bool st[N];inline vo..原创 2021-03-15 23:45:41 · 198 阅读 · 0 评论 -
AcWing 1171. 距离(Tarjan 离线求树上lca)
这道题本质上就是要搞懂 无根树上任意两点距离就是 各自到根节点距离之和再减去两倍的lca节点到根节点距离求lca我们这里可以采用Tarjan离线的方式~#include<bits/stdc++.h>using namespace std;const int N=10010,M=N*2;typedef pair<int,int> PII;int n,m,ne[M],h[N],e[M],idx,w[M],f[N],res[M],dist[N],st[N];void..原创 2021-03-09 23:14:02 · 187 阅读 · 0 评论 -
AcWing 456. 车站分级 (虚拟节点优化二分图边数、拓扑序、差分约束、最长路)
原题链接思路:代码:#include<bits/stdc++.h>using namespace std;const int N=2010,M=1e6+10;int n,m,e[M],ne[M],h[N],vis[N],dist[N],idx,w[M],d[N];void add(int a,int b,int c){ e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++; d[b]++;}vector<int&g原创 2021-03-06 22:21:00 · 159 阅读 · 0 评论 -
AcWing 164. 可达性统计(bitset、拓扑序)
思路:本质上还是一个动态规划 父亲点答案等于所有儿子数+1,暴力会超时,需要用bitset压位优化常数注意bitset.count()方法是数一个串1的个数~#include<bits/stdc++.h>using namespace std;const int N=30010,M=30010;int n,idx,e[M],ne[M],h[N],d[N],m;queue<int>q;vector<int>ans;bitset<N>bi..原创 2021-03-06 18:11:50 · 174 阅读 · 0 评论 -
AcWing 1192. 奖金 (拓扑序、贪心)
思路:按拓扑序分配钱,儿子比父亲多一元钱#include<bits/stdc++.h>using namespace std;const int N=10010,M=20010;int n,idx,e[M],ne[M],h[N],d[N],m,ans[N];queue<int>q;void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}void tp(){ for(int i=1;i&l..原创 2021-03-06 17:36:40 · 169 阅读 · 0 评论 -
AcWing 1191. 家谱树(拓扑序板子题)
思路:向每个人的自己儿子连有向边,跑一遍拓扑即可#include<bits/stdc++.h>using namespace std;const int N=110,M=N*N;int n,idx,e[M],ne[M],h[N],d[N];queue<int>q;vector<int>ans;void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++;}void tp(){ fo..原创 2021-03-06 17:15:18 · 177 阅读 · 0 评论 -
AcWing 1273. 天才的记忆(区间RMQ)
思路:区间RMQ,本质是动态规划#include<bits/stdc++.h>using namespace std;const int N=2e5+10,M=20;int n,m,a[N],f[N][M];void init(){ for(int j=0;j<M;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ if(!j)f[i][j]=a[i]; e...原创 2021-03-06 16:58:12 · 218 阅读 · 0 评论 -
第十次CCF计算机软件能力认证 第三题 Markdown(大模拟、字符串)
题目链接一道很有区分度的模拟题,我做了1.5h~本质上如果不算强调和链接的影响 我们是不难做出前三种情况的但是 随着对这道题目的深入 我发现做出这道题目主要有两个难点:1.要考虑到输入状态的转移,比如输入段落切换到输入表格、输入表格切换到输入段落2.虽然强调不存在嵌套 但链接和强调都存在嵌套 我们可以强调处理完再处理链接,这两种先后顺序处理是不影响的(可以观察替换格式易得)#include<bits/stdc++.h>using namespace std;str.原创 2021-03-06 00:32:19 · 2353 阅读 · 18 评论 -
AcWing 1091. 理想的正方形 (求两次单调队列 )
这道题我们可以将每一行的滑动窗口求出来 然后统一放在窗口的最后一个位置 最后进行列的滑动窗口压缩 最大值最小值分别做一次 遍历一遍预处理出的最大值和最小值数组 更新答案即可#include<bits/stdc++.h>using namespace std;const int N=1010;int n,m,k,a[N][N],ans_min[N][N],ans_max[N][N];void getmin(int a[],int b[],int n){ deque<..原创 2021-03-05 21:08:05 · 136 阅读 · 0 评论 -
AcWing 1089. 烽火传递(单调队列优化dp)
思路:代码:#include<bits/stdc++.h>using namespace std;#define int long longconst int N=2e5+10;int n,k,a[N],f[N];signed main(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } deque<int>q; ..原创 2021-03-02 00:59:23 · 223 阅读 · 0 评论 -
AcWing 1087. 修剪草坪 (单调队列优化dp)
思路:代码:#include<bits/stdc++.h>using namespace std;#define int long longconst int N=1e5+10;int n,k,a[N],f[N];int get(int x){ if(x==0)return 0; return f[x-1]-a[x];}signed main(){ cin>>n>>k; for(int i=1;i<=...原创 2021-03-02 00:21:31 · 180 阅读 · 0 评论 -
AcWing 135. 最大子序和 (单调队列变形 双端队列)
可以依次枚举每个点 然后去找这个点前面m个的区间内最小值 这样就变成了滑动窗口问题~#include<bits/stdc++.h>using namespace std;const int N=3e5+10;int n,m,s[N];deque<int>q;int main(){ cin>>n>>m; for(int i=1;i<=n;i++)cin>>s[i],s[i]=s[i-1]+s[i]; ..原创 2021-03-01 23:37:08 · 141 阅读 · 0 评论 -
AcWing 1285. 单词(Fail树,AC自动机)
思路:ac自动机可以用来求一段文本内多个模式串的出现次数,是kmp在trie上的拓展,fail树可以on时间内求每个子串在所有子串的出现次数就是反向加边建立fail树递推就可以#include<bits/stdc++.h>using namespace std;const int N=1e6+10;int tr[N][26],n,idx,id[210],f[N],ne[N];char s[N];vector<int>ans;void insert(int..原创 2021-03-01 22:56:36 · 276 阅读 · 0 评论 -
AcWing 1282. 搜索关键词(AC自动机板子题)
AC自动机板子题:trie+bfs+kmp#include<bits/stdc++.h>using namespace std;const int M=1e6+10,N=1e4+10,S=55;int t,n,tr[N*S][26],cnt[N*S],idx,ne[N*S];char s[M];void insert(){ int p=0; for(int i=0;s[i];i++){ int t=s[i]-'a'; if...原创 2021-03-01 22:55:02 · 222 阅读 · 0 评论 -
AcWing 1049. 大盗阿福 (线性dp,状态机)
思路:dp[i][0]表示第i家店铺不行窃,dp[i][1]表示第i家店铺行窃,然后从两种状态中转移即可#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int t,a[N],n,dp[N][2];int main(){ cin>>t; while(t--){ scanf("%d",&n); for(int i=1;i<=n;i..原创 2021-02-27 23:44:50 · 188 阅读 · 0 评论 -
AcWing 1304. 佳佳的斐波那契(数学、矩阵快速幂)
原题链接思路:涉及到一波数学推导,具体可以参看如下:代码:#include<bits/stdc++.h>using namespace std;const int N=4;#define ll long longll n,mod;ll a[][N]={ {0,1,0,0}, {1,1,1,0}, {0,0,1,1}, {0,0,0,1}};void mul(ll a[],ll b[],ll c[][N]){ l.原创 2021-02-27 23:34:57 · 154 阅读 · 0 评论 -
AcWing 1303. 斐波那契前 n 项和 (矩阵快速幂)
输入样例:5 1000输出样例:12思路:矩阵快速幂裸题#include<bits/stdc++.h>using namespace std;const int N=3;#define ll long longll n,mod;ll a[][N]={ {0,1,0}, {1,1,1}, {0,0,1}};void mul(ll a[],ll b[],ll c[][N]){ ll tep[N]={0}; for(..原创 2021-02-26 17:52:04 · 152 阅读 · 0 评论 -
AcWing 1293. 夏洛克和他的女朋友(思维 欧拉筛 图论)
夏洛克有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。他买了nn件珠宝,第ii件的价值是i+1i+1,也就是说,珠宝的价值分别为2,3,…,n+12,3,…,n+1。华生挑战夏洛克,让他给这些珠宝染色,使得一件珠宝的价格是另一件珠宝的价格的质因子时,两件珠宝的颜色不同。并且,华生要求他使用的颜色数尽可能少。请帮助夏洛克完成这个简单的任务。输入格式只有一行一个整数nn,表示珠宝件数。输出格式第一行一个整数kk,表示所使用的颜色数;...原创 2021-02-23 11:35:59 · 404 阅读 · 0 评论 -
AcWing 1292. 哥德巴赫猜想 (预处理、欧拉筛)
哥德巴赫猜想的内容如下:任意一个大于44的偶数都可以拆成两个奇素数之和。例如:8=3+58=3+520=3+17=7+1320=3+17=7+1342=5+37=11+31=13+29=19+2342=5+37=11+31=13+29=19+23现在,你的任务是验证所有小于一百万的偶数能否满足哥德巴赫猜想。输入格式输入包含多组数据。每组数据占一行,包含一个偶数nn。读入以00结束。输出格式对于每组数据,输出形如n = a + b,其中a,ba,b是...原创 2021-02-23 11:14:41 · 203 阅读 · 0 评论 -
AcWing 1100. 抓住那头牛 BFS
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N,牛位于点K。农夫有两种移动方式:从X移动到X−1或X+1,每次移动花费一分钟 从X移动到2X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?输入格式共一行,包含两个整数N和K。输出格式输出一个整数,表示抓到牛所花费的最少时间。数据范围输入样例:5 17输出样例:4BFS,老水题了,还是一维的。。#...原创 2021-02-15 21:39:43 · 522 阅读 · 0 评论 -
AcWing 188. 武士风度的牛 BFS 水题
题目描述农民John有很多牛,他想交易其中一头被Don称为The Knight的牛。这头牛有一个独一无二的超能力,在农场里像Knight一样地跳(就是我们熟悉的象棋中马的走法)。虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个x,y的坐标图来表示。这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了The Knight的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。现在你的任务是,确定The Knight要想吃到草,至少需要跳多少次。原创 2021-02-15 21:24:42 · 218 阅读 · 0 评论 -
AcWing1076. 迷宫问题 宽搜
给定一个n×n的二维数组,如下所示:int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。数据保证至少存在一条从左上角走到右下角的路径。输入格式第一行包含整数 n。接下来n行,每行包含n个整数 0...原创 2021-02-15 21:05:08 · 193 阅读 · 0 评论