![](https://img-blog.csdnimg.cn/ce33060ec34247e9b299aab0351eefdb.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Acwing算法基础课
记录算法基础课所学到的东西,并写上模板题题解,方便后续复习
MangataTS
一个爱折腾的Coder
展开
-
AcWing 845. 八数码(BFS)
题目链接https://www.acwing.com/problem/content/description/847/思路这道题的难点在于怎么存储状态,因为是一个九宫格,我们其实可以把它压缩成一行,然后用字符串存储,那么这样我们就解决了状态问题,然后我们直接通过find函数或者自己手写匹配,每次找到x的位置,然后将x往四个方向移动,看是否是新状态,当然不能出界,如果我们找到了这个状态那么就返回这个状态的最短交换次数即可,如果没找到最后返回1即可,其实我是先写的DFS,然而DFS好像不太聪明的样子,然后原创 2022-01-25 20:36:25 · 353 阅读 · 0 评论 -
AcWing 844. 走迷宫(BFS or DP)
题目链接https://www.acwing.com/problem/content/description/846/思路直接用BFS跑一个最短路就好了,因为边权都是为1的,并且每次只有四个方向选择代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#define endl "\原创 2022-01-25 20:35:37 · 219 阅读 · 0 评论 -
AcWing 843. n-皇后问题(DFS)
题目链接https://www.acwing.com/problem/content/description/845/思路我们每一层只需要搜一个,然后判断一下这一层的这个点的列、左斜线、右斜线是否被搜过,如果没有被搜过那么就往下搜,然后归的过程记得回溯,最后搜到第N层的时候就直接输出这种情况即可#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll lo原创 2022-01-25 20:34:54 · 301 阅读 · 0 评论 -
AcWing 842. 排列数字(DFS)
题目链接https://www.acwing.com/problem/content/description/844/思路回溯搜索即可代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#define endl "\n"#define PII pair<int,int&g原创 2022-01-25 20:34:12 · 175 阅读 · 0 评论 -
AcWing 841. 字符串哈希(字符串Hash)
题目连接https://www.acwing.com/problem/content/843/思路我们用一个数组a记录改字符串的前缀hash值,然后和前缀和类似的方法,不过注意的是,我们在计算区间hash值的时候需要对位数较低的数进行移位操作,也就是给a[l-1]乘上一个pr−l+1p^{r-l+1}pr−l+1,然后再和a[r]做运算代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分------原创 2022-01-25 15:48:52 · 161 阅读 · 0 评论 -
AcWing 840. 模拟散列表(散列hash)
题目连接https://www.acwing.com/problem/content/description/842/思路使用开放寻址法,思路大概是这样我们讲要查询的数模上一个大于n的质数,然后这表示它呗映射到了哪个坑位,如果这个坑位有人的话,那么我们就往下走(假设这些坑位是一个环状),因为我们的坑位数是大于我们要映射的数的,所以不会死循环,这个算法的期望复杂度是O(1)的,但是随着我们映射关系的增加这个常数会变得很大的代码#include<bits/stdc++.h>using n原创 2022-01-25 15:48:08 · 237 阅读 · 0 评论 -
AcWing 838. 堆排序
题目连接https://www.acwing.com/problem/content/description/840/思路使用堆排序的时候我们只需要实现简单的up操作(向上更新)和down操作(向下更新),然后每次输出1位置的数,然后更新即可代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000原创 2022-01-25 15:47:15 · 155 阅读 · 0 评论 -
AcWing 839. 模拟堆
题目链接https://www.acwing.com/problem/content/841/思路纯纯模拟堆的操作,后面细说,可以先看代码代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int原创 2022-01-24 23:06:32 · 222 阅读 · 0 评论 -
AcWing 240. 食物链
题目连接https://www.acwing.com/problem/content/description/242/思路1通过带权并查集来解决这个问题,我们构建一个这样的关系,我们对链的长度mod 3如果是0那么我们假定是A类说明和根节点是同类,可以吃C类如果是1那么我们假定是B类说明可以吃根节点也就是A类如果是2那么我们假定是C类,说明可以吃B类这样我们就根据链的深度对三类做了一个划分,那么我们想做的关系判断也就不难了,详情请看代码思路2通过种类并查集解决这个问题代码#incl原创 2022-01-24 23:03:29 · 146 阅读 · 0 评论 -
AcWing 837. 连通块中点的数量
题目连接https://www.acwing.com/problem/content/839/思路因为有集合关系,所以我们考虑用并查集来维护,此题对于和并和查询是否在一个集合维护比较简单,对于一个集合内的元素个数,我们可以初始化一个集合元素个数,都是1,然后每次合并的时候判断是否有两个不同集合合并,如果有的话,就把我们当作祖先集合的元素个数更新(也就是加上另外一个集合的元素个数)代码#include<bits/stdc++.h>using namespace std;//-----原创 2022-01-24 23:01:53 · 156 阅读 · 0 评论 -
AcWing 836. 合并集合
题目连接https://www.acwing.com/problem/content/838/思路并查集模板题当操作是合并时,先判断两者是否在一个集合,然后合并(其实不用判断也可以,反正都是一个集合的)当操作是查询时,我们直接判断两者是否在一个集合里面就好了代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#def原创 2022-01-24 22:47:15 · 191 阅读 · 0 评论 -
AcWing 143. 最大异或对
题目连接https://www.acwing.com/problem/content/145/思路贪心的想,如果我们想找到一个异或的最大值,那么我们肯定想每一位最好都是相反的,如果没有这样的情况那么就只能走相同的一边,最后贪出来的就是最优解。代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000原创 2022-01-24 22:46:28 · 227 阅读 · 0 评论 -
AcWing 835. Trie字符串统计
题目连接https://www.acwing.com/problem/content/submission/837/思路我们通过trie树的结构将我们要插入的字符串插进去,但是要注意一点,最后我们要统计一下插入的字符串的个数,然后查找的时候同理,这个结构相当于每一层有26个字符代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long lon原创 2022-01-24 22:45:17 · 222 阅读 · 0 评论 -
AcWing 831. KMP字符串
题目连接https://www.acwing.com/problem/content/description/833/思路kmp和暴力匹配的差别就在于我们求了子串的boarder,由于这个boarder有一个对称性,也就是前缀等于后缀,所以我们匹配失败的时候其实不用回到字串的起始地点,让它回到前缀的地方就好了,因为之前的位置都是匹配成功的。代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----原创 2022-01-24 22:25:29 · 131 阅读 · 0 评论 -
AcWing 154. 滑动窗口
题目连接https://www.acwing.com/problem/content/description/156/思路和单调栈类似的思路,只不过我们现在维护的是一个双端队列,可以直接使用STL的dequeue但是数组模拟可能会更加的快速,而且数组模拟更能体会到单调队列的思想吧,如果我们相维护的是一个单调递增的队列,如果在一个数x的右边存在一个比x还小的数,那么x这个数就永远不会在之后输出了,因为我们取得是区间最小值,所以我们就吧x出队,当然不在区间范围内得数我们也要出队,然后我们就能得到一个单调的原创 2022-01-24 22:23:14 · 252 阅读 · 0 评论 -
AcWing 830. 单调栈
题目连接https://www.acwing.com/problem/content/832/思路我们维护一个严格单调递增的序列,我们考虑这样一个问题,如果有一个比x还小的值,而且还在x右边,那么x就永远用不到了,因为我们要取得是左边最小得一个值,所以维护一个严格单调递增的序列即可,自然而然想到单调栈代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define原创 2022-01-24 22:21:25 · 152 阅读 · 0 评论 -
AcWing 829. 模拟队列
题目连接https://www.acwing.com/problem/content/831/思路我们定义一个head和tail表示头尾指针,然后push的时候就把tail指针往后移动,pop的时候就把head指针往前移动,当两指针相等的时候说明队列里面没有元素,head指针指向的就是我们的队首元素代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define原创 2022-01-24 22:19:47 · 135 阅读 · 0 评论 -
AcWing 3302. 表达式求值
题目连接https://www.acwing.com/problem/content/3305/思路我们用一个map记录不同符号的一个优先级,然后用两个栈分别记录数字和操作符,如果当前的符号是右括号,那么我们就得强制处理到左括号去,如果当前读到的是一个数字,那么我们直接把数字放入数字栈里面就好了,如果当前读到的是一个运算符,那么我们就得先处理栈中优先级大于等于当前运算符的一些运算,最后将当前的运算符加入到栈中,那么这个栈就一个运算符单调递增的一个栈,详情请看代码代码#include<bits原创 2022-01-23 22:19:34 · 168 阅读 · 0 评论 -
AcWing 828. 模拟栈
题目连接https://www.acwing.com/problem/content/830/思路我们直接开一个a数组,然后用一个整数top表示栈顶,0的时候表示为栈空,然后不断模拟就好啦#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000009#define endl "\n"#defi原创 2022-01-23 22:18:37 · 148 阅读 · 0 评论 -
AcWing 827. 双链表
题目连接https://www.acwing.com/problem/content/829/思路和单链表类似,只不过,我们这里使用0当作头节点,1当作尾节点,所以,我们真正的节点是从2开始的代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000009#define endl "\n"原创 2022-01-23 22:18:02 · 245 阅读 · 0 评论 -
高精度运算
高精度加法两个大数的高精度加法:模板题题目连接:https://www.acwing.com/problem/content/793/代码vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i原创 2022-01-23 22:10:33 · 642 阅读 · 0 评论 -
AcWing 826. 单链表
题目连接https://www.acwing.com/problem/content/828/思路有点类似链式前向星建图,不同的是链式前向星是多链表的形式,这个只是单链表,我们的头节点标记为-1,每次插入的时候将当前的指针指向后面的元素,然后将前面的指针指向当前即可完成插入操作,注意这里的节点是从0开始计算的,关于删除操作,我们需要注意删除头节点的时候直接让head指向head的下一个位置即可#include<bits/stdc++.h>using namespace std;#de原创 2022-01-20 15:29:28 · 355 阅读 · 0 评论 -
AcWing 789. 数的范围
题目链接https://www.acwing.com/problem/content/791/思路写一个划分x为左边界和有边界的整数二分方法即可#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>ll ksm(ll a,ll b) { ll ans = 1; f原创 2022-01-19 21:44:56 · 288 阅读 · 0 评论 -
AcWing 803. 区间合并
题目连接https://www.acwing.com/problem/content/805/思路我们先对区间的起点和终点从小到大排序我们很容易发现,区间合并无非三种情况右边区间包含在当前区间内右边区间和当前区间有交集右边区间不在当前区间内对于第一种情况,当前区间的右端点不会发生变化,对于第二种情况,当前区间的右端点更新,对于第三种情况,当前区间的左右端点都更新,其实这里左端点并没有什么作用代码#include<bits/stdc++.h>using namespace原创 2022-01-20 15:18:40 · 387 阅读 · 0 评论 -
AcWing 802. 区间和
题目连接https://www.acwing.com/problem/content/804/思路用一个map用来映射我们的真实地址和逻辑地址,然后用一个map来存储真实地址的值,然后再单独开一个b数组求得是逻辑地址得前缀和,然后二分一下l和r输出即可,这里要注意边界问题代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"原创 2022-01-20 15:17:06 · 130 阅读 · 0 评论 -
AcWing 801. 二进制中1的个数
题目连接https://www.acwing.com/problem/content/803/思路众所周知有一个__builtin_popcount的函数可以很方便的帮我们计算出整数二进制下的1的个数,当然我们也可以通过lowbit来计算1的个数lowbit原理根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作代码#include<bi原创 2022-01-20 15:14:43 · 176 阅读 · 0 评论 -
AcWing 2816. 判断子序列
题目连接https://www.acwing.com/problem/content/2818/思路双指针扫描,一个指向A,一个指向B,然后匹配成功就都往后移否则,b往后移动,注意一下边界情况就行,我在这RE了好几次#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>原创 2022-01-20 15:11:05 · 132 阅读 · 0 评论 -
AcWing 800. 数组元素的目标和
题目连接https://www.acwing.com/problem/content/802/思路直接使用map存一下x-a的数据就好啦,然后在输入b的时候直接判断是否有这个值即可,因为都是不同的数,当然我们也可以用双指针,一个指向A,另一个指向B然后往右扫即可,因为都是有序的代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\原创 2022-01-20 15:08:52 · 84 阅读 · 0 评论 -
AcWing 799. 最长连续不重复子序列
题目连接https://www.acwing.com/problem/content/801/思路用一个map或者数组vis标记我们以及存在的元素,然后定义两个指针,如果当前这个元素没被访问过,那么直接让r指针往后移动,然后去一个最大值,然后移动l指针到a[r]这个值相同的位置即可代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl原创 2022-01-20 15:06:42 · 170 阅读 · 0 评论 -
AcWing 798. 差分矩阵
题目连接https://www.acwing.com/problem/content/800/思路差分矩阵注意的是在构造差分矩阵的时候不是一维的和前一个数相减,而是看作一个小矩阵进行操作代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>ll ksm(ll a原创 2022-01-20 12:34:27 · 146 阅读 · 0 评论 -
AcWing 797. 差分
题目连接https://www.acwing.com/problem/content/799/思路裸差分,我们通过相邻两数之差就能获取差分数组即d[i]=a[i]−a[i−1]d[i]=a[i]-a[i-1]d[i]=a[i]−a[i−1],我们修改i这个位置的值,比如说给他加上一个x,实际上就是在我们求前缀和的时候,之后的所有数都加上了一个x,所以我们区间修改是这样的a[L]+x,a[R+1]-x#include<bits/stdc++.h>using namespace std;原创 2022-01-20 12:33:18 · 180 阅读 · 0 评论 -
AcWing 796. 子矩阵的和
题目链接https://www.acwing.com/problem/content/798/思路二维前缀和模板,在我的蓝桥集训之前缀和差分有讲到过:https://blog.csdn.net/m0_46201544/article/details/122371482#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#defi原创 2022-01-19 23:15:39 · 137 阅读 · 0 评论 -
AcWing 795. 前缀和
题目连接https://www.acwing.com/problem/content/797/思路前缀和板子,我们通过pre[i]=pre[i−1]+a[i]pre[i] = pre[i-1] + a[i]pre[i]=pre[i−1]+a[i]能维护a的前缀和#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define原创 2022-01-19 23:08:21 · 171 阅读 · 0 评论 -
AcWing 790. 数的三次方根
题目连接https://www.acwing.com/problem/content/792/思路浮点二分没啥好说的,迭代到一个零界点即可代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>ll ksm(ll a,ll b) { ll ans = 1; f原创 2022-01-19 22:48:54 · 154 阅读 · 0 评论 -
AcWing 788. 逆序对的数量
题目连接https://www.acwing.com/problem/content/790/思路归并排序求逆序对是一个很经典的利用归并排序的特性的一个题目,上一篇博客讲到了归并排序的其实就是我们划分出来log2nlog_2nlog2n层交换层,每下一层的划分都是划分当前这一层的一半如图大概是这个图的形式,所以我们是先递归最终递归到区间长度2or1,然后再处理区间,对于我们处理的这个区间,我们又划分成了两段,在这两段我们通过双指针的算法可以实现O(N)O(N)O(N)的时间复杂度有序的合并,在合原创 2022-01-19 21:43:02 · 199 阅读 · 0 评论 -
AcWing 787. 归并排序
题目连接https://www.acwing.com/problem/content/789/思路归并排序的核心就在于双指针处理的阶段,我们用两个指针分别表示左边区间的最小的位置和右边区间最小的位置,由于我们是先递归的,所以会直接递归到区间长度为1的,所以左边区间一定是排好序的,我们在归的过程中就对序列进行排序操作#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;int a[N],temp[N];i原创 2022-01-19 21:35:49 · 208 阅读 · 0 评论 -
AcWing 786. 第k个数
题目链接https://www.acwing.com/problem/content/788/思路先用一种nlog2nnlog_2nnlog2n的排序算法排序,然后输出第k个元素即可代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>ll ksm(ll a,原创 2022-01-19 21:34:28 · 193 阅读 · 0 评论 -
AcWing 785. 快速排序
题目连接https://www.acwing.com/problem/content/787/思路找一个分界点,然后坐标左边都小于他,右边都大于他,体现分治的思想我们有一个l和r指针,都往中间走,然后左边遇到大于我们选中的x值就停下来,右边就遇到小于我们选择的x值就停下来,然后交换两数,然后重复这个过程,知道两个指针相遇就完成了我们的划分,即x左边的都小于等于x,x右边的都大于等于x#include<bits/stdc++.h>using namespace std;const原创 2022-01-19 21:32:13 · 176 阅读 · 1 评论