- 博客(82)
- 收藏
- 关注
原创 一篇文章学会滑动窗口(单调队列) 超详细解释
朴素做法: 就是两层循环 外层循环每一个数 内循环窗口内每一个值,这样的时间复杂度是O(nm);这样我们就可以用 单调队列来优化 可将时间复杂度降为 O(n)。举例 这是我们准备求的一个数组 红色是元素值 灰色是数组下标154. 滑动窗口 - AcWing题库#include <iostream>#include <cstring>#include <algorithm>using nam...
2022-04-22 10:56:58 1741
原创 区间合并
#include <iostream>#include <cstring>#include <algorithm>#include <vector>#define x first#define y secondusing namespace std;typedef pair<int, int> PII;int n;vector<PII> segs;void merge(vecto...
2022-04-19 12:35:26 208
原创 801. 二进制中1的个数
#include <iostream>#include <cstring>#include <algorithm>using namespace std;int n;int main(){ cin>>n; while (n -- ) { int x; cin>>x; int cnt=0; while(x) { ...
2022-04-17 12:48:54 142
原创 双指针算法 (模板题:最长连续不重复子序列 数组元素的目标和 判断子序列)
最长连续不重复子序列#include<iostream>using namespace std;const int N=1e5+10;int s[N],a[N];int main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i];//将数据放进来 int res=0;//答案 for(int i=0,j=0;i<n;i++)//双指针算...
2022-04-17 12:43:37 135
原创 第十三届蓝桥杯 C++ B组 统计子矩阵
//我们可以看成一维前缀和//每一列看成一个前缀和 然后 从上往下枚举行 //根据单调性 可以使用 双指针算法#include<iostream>#include<cstdio>using namespace std;const int N=510;typedef long long LL;int s[N][N];int n,m,k;int main(){ scanf("%d%d%d",&n,&m,&a...
2022-04-13 18:25:17 800 1
原创 第十二届蓝桥杯省赛 B组 c++ 填空题解答
答案:67108864#include<iostream>using namespace std;int main(){ //1MB=1024KB,1KB=1024B,1B=8b cout<<256*1024*1024/4<<endl; return 0;}答案:3181#include<iostream>using namespace std;int cnt[10];bool check(int x){..
2022-04-08 09:19:57 1086
原创 k倍区间 前缀和+记录余数数组
//当右端点r固定了之后//(s[r]-s[l-1])%k==0 其实只要 s[r]与s[l-1]的余数相同即可//我们将l的范围改一下 0~r-1 即是s[r]与s[l]的余数相同即可//cnt[s[i]%k]记录s[i]除k的余数//可以通过枚举右端点 然后查找一下 余数相同的加上 之后 cnt[s[i]%k]++即可//注意点 cnt[0]=1 0 可以被任何数整除#include<iostream>using namespace std;typedef lon...
2022-04-07 15:05:30 153
原创 四平方和 三种解法
暴力求解#include<iostream>#include<cmath>using namespace std;int n;int main(){ scanf("%d",&n); for(int a=0;a*a<=n;a++) for(int b=a;b*b+a*a<=n;b++) for(int c=b;c*c+b*b+a*a<=n;c++) ...
2022-04-07 11:39:42 281
原创 shocked what dfs 可以这样用 带分数
//枚举 a 枚举 c 最后用 c*n-a*c 求出 b 来检测 b 即可//dfs_a(u,a) 用了u个数 a的值为a//dfs_c(u,a,c) 用了u个数 a的值为a c的值为c//c*n-a*c 求出b 然后将b每一位拿出来 看看是否用过 或者 是否有 0 全检测完 看看所有数是否用过#include<iostream>#include<cstring>#include<algorithm>using namespace std;c...
2022-04-07 09:24:36 148
原创 AcWing 902. 最短编辑距离
给定两个字符串AA和BB,现在要将AA经过若干操作变为BB,可进行的操作有:删除–将字符串AA中的某个字符删除。 插入–在字符串AA的某个位置插入某个字符。 替换–将字符串AA中的某个字符替换为另一个字符。现在请你求出,将AA变为BB至少需要进行多少次操作。输入格式第一行包含整数nn,表示字符串AA的长度。第二行包含一个长度为nn的字符串AA。第三行包含整数mm,表示字符串BB的长度。...
2022-04-04 18:01:55 111
原创 蓝桥杯.双向排序
#include<iostream>#include<cstring>#include<algorithm>#define x first#define y secondusing namespace std;typedef pair<int,int> PII;const int N=100010;int n,m;PII stk[N];int ans[N];int main(){ scanf("%d%d"...
2022-04-04 08:36:16 483
原创 树状数组和线段树
c [ x ] = ( x - lowbit (x) , x ] ;lowbit(x): x 的二进制表示中,最后有 k 个 0 , lowbit(x)=2^k.第几层就看二进制表示中0的个数。树状数组:1、在某个位置上加上一个数 A[x]+vfor(int i=x;i<=n;i+=lowbit(i)) c[x]+=v;2、求某一个前缀和int res=0;for(int i=x;i>=0;i=lowbit(x)) res+=...
2022-03-31 09:06:59 342
原创 蚂蚁感冒
#include<iostream>#include<cstring>#include<cmath>using namespace std;const int N=55;int x[N];int main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>>x[i]; int left=0,right=0;//left 蚂蚁从左向...
2022-03-26 11:10:31 494
原创 费解的开关
灰色代表暗,黄色代表亮,我们需要通过一定步数的操作,将他全亮。这个案例按两次就可以变全亮。我们可以发现:1、一个按钮最多只会按一次,按两次的话状态不变,等于没按。2、如果上一行按完了,发现还有没亮的,我们必须要按没亮的对应的下一行,才可以将他变亮。3、到最后检查最后一行是不是都亮了,都亮了就说明得到正解,没有都亮,说明错误解。95. 费解的开关 - AcWing题库#include<iostream>#include<cstring>...
2022-03-24 12:11:29 675
原创 单调队列 滑动窗口
如果 -1 比 -3 大 而且 -1在 , -3也一定在,那么-1就用不到,可以删去。最后队列里存的就是从小到大的数。单调队列应用场景:1、窗口里的最大、最小值2、离他最近的比他小的或者大的元素求最小值:就是当a[q[tt]]>=a[i] 就tt-- 此时队列中就是单调递增的 队头就是最小值求最大值:就是当a[q[tt]]<=a[i] 就tt-- 此时队列中就是单调递减的 队头就是最大值154. 滑动窗口 - AcWing题库#include<io...
2022-03-21 17:33:53 487
原创 一篇文章搞懂离散化 (例题:区间和)
802. 区间和 - AcWing题库#include<iostream>#include<algorithm>#include<vector>using namespace std;typedef pair<int,int> PII;const int N=3e5+10;int n,m;int a[N],s[N];vector<int> alls;//待离散化的值vector<PII> add,qu...
2022-03-21 12:30:47 400
原创 双指针算法
1、很简单的题目 换行输出一个字符串中所有单词,单词间用空格隔开#include<iostream>#include<string.h> using namespace std;int main(){ char str[1000]; cin.getline(str,1000); int n=strlen(str); for(int i=0;i<n;i++) { int j=i; ..
2022-03-21 10:18:20 162
原创 差分矩阵
798. 差分矩阵 - AcWing题库#include<iostream>using namespace std;const int N=1010;int a[N][N],b[N][N];void insert(int x1,int y1,int x2,int y2,int c){ b[x1][y1]+=c; b[x1][y2+1]-=c; b[x2+1][y1]-=c; b[x2+1][y2+1]+=c;}int ma...
2022-03-21 08:20:54 118
原创 差分
a数组是b数组的前缀和,b数组是a数组的差分。如果要更改a数组中某一段的值,直接更改b即可,a也会随之更改。a数组一开始插入就相当于在 b[n]+=x,b[n+1]-=x,就可以完成 a[n]=x;797. 差分 - AcWing题库#include<iostream>using namespace std;const int N=1e5+10;int a[N],b[N];void insert(int l,int r,int x){ b[l]+...
2022-03-20 18:25:57 338
原创 子矩阵的和
796. 子矩阵的和 - AcWing题库#include<iostream>using namespace std;const int N=1010;int a[N][N],s[N][N];int main(){ int n,m,q; cin>>n>>m>>q; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin&...
2022-03-20 17:47:12 282
原创 前缀和
795. 前缀和 - AcWing题库#include<iostream>using namespace std;const int N=100010;int s[N];int n,m;int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>s[i]; for(int i=1;i<=n;i++) s[i]+=s[i-1]; while(m--) .
2022-03-20 17:09:40 84
原创 高精度除法
794. 高精度除法 - AcWing题库#include<iostream>#include<vector>#include<algorithm>using namespace std;vector<int> div(vector<int> &A,int b,int &r){ vector<int> C; r=0; for(int i=A.size()-1;i>=0;i.
2022-03-20 16:55:05 199
原创 高精度乘法
793. 高精度乘法 - AcWing题库#include<iostream>#include<vector>using namespace std;vector<int> mul(vector<int> A,int b){ vector<int> C; int t=0; for(int i=0;i<A.size();i++) { t+=A[i]*b; .
2022-03-20 16:18:54 105
原创 高精度减法
1、将两个数用string串读入。2、逆序放入vector容器中。3、判断大小 大-小4、t表示进位, t<0(表示有进位)792. 高精度减法 - AcWing题库#include<iostream>#include<vector>#include<string>using namespace std;const int N=1e5+10;bool cmp(vector<int> &A,vector<i
2022-03-20 15:52:44 65
原创 高精度加法
1、将两个数用string串读入。2、逆序放入vector容器中。3、进行每一位相加 t用来记录进位 初始为0if(i<A.size()) t+=A[i];if(i<A.size()) t+=A[i];C.push_back(t%10);t/=10;4、最后逆序输出C即可。791. 高精度加法 - AcWing题库#include<iostream>#include<string>#include<vector>u
2022-03-20 15:06:28 63
原创 二分
789. 数的范围 - AcWing题库#include<iostream>using namespace std;const int N=1e6+10;int n,q[N],m;int bsearch_left(int x,int l,int r){ while(l<r) { int mid=l+r>>1; if(q[mid]>=x) r=mid; else l=mid+1; ...
2022-03-20 11:12:02 164 2
原创 逆序对的数量
逆序对三种情况都在分界点左边 merge(l,mid)都在分界点右边 merge(mid+1,r)分在分界点两边对于L、R序列,当a [ i ] > a [ j ] 时,L序列中 a [ i ~ mid ] > a [ j ],那么 s [ j ] = mid - i + 1; ( s [ j ] 是 j 的逆序对数量) 788. 逆序对的数量 - AcWing题库#i...
2022-03-20 10:35:22 86
原创 归并排序
1、确定分解点 mid = l+r >>12、递归排序左右3、归并(双指针遍历左右两边数组,依次将较小值放入tmp数组,最后赋值到q数组中)787. 归并排序 - AcWing题库#include<iostream>using namespace std;const int N=1e5+10;int q[N],tmp[N];void merge_sort(int q[],int l,int r){ if(l>=r) return;...
2022-03-20 09:56:02 181
原创 快速排序 quick_sort
1、 确定分界点 x = q[l+r>>1]2、 调整区间 左边的都<=x,右边的都>=x3、 递归处理左右两段AcWing 785. 快速排序 - AcWing#include<iostream>using namespace std;const int N=1e6+10;int n,q[N];void quick_sort(int q[],int l,int r){ if(l>=r) return; ...
2022-03-19 18:15:51 295
原创 整数划分 (完全背包问题)
解法一:完全背包思路解题可以将它看成是取1~n的石头,每个石头不限个数,需要取总和恰好是 n.即最终状态转移方程式是f[i][j]=f[i-1][j]+f[i][j-1]。900. 整数划分 - AcWing题库//一维优化 和完全背包优化方式一样 这里不做过多赘述了#include<iostream>using namespace std;const int N=1010,mod=1e9+7;int n;int f[N];int main()...
2022-03-19 15:57:47 932 4
原创 石子合并 dp+前缀和
状态计算:每次划分 从左边 合并 1 堆 直到合并 k - 1 堆(右边要留一堆)。状态方程: 按 左边 k 来划分,把左边的合并成本+右边的合并成本+最后两堆合并的成本。282. 石子合并 - AcWing题库#include<iostream>using namespace std;const int N=310;int s[N];//记录前缀和int f[N][N];//f[l][r]表示从l到r合并成一堆的最小代价int main()...
2022-03-18 20:43:01 270
原创 最长公共子序列
f [ i , j ] :第一个序列的前 i 个字母,且在第二个序列的前 j 个字母中出现的子序列。状态计算:对于每个 a [ i ] , b [ j ] 一共四种情况。不选 a[ i ] 不选 b [ j ] 不选 a[ i ] 选 b [ j ] 选 a[ i ] 不选 b [ j ] 选 a[ i ] 选 b [ j ] 00 01 10 11 那么来慢慢分析转移方程:00 的时候是 f [ i , j ] = f [ i ...
2022-03-18 19:21:12 318
原创 最长上升子序列Ⅰ
895. 最长上升子序列 - AcWing题库#include<iostream>#include<algorithm>using namespace std;const int N=1010;int f[N],a[N];int n;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1...
2022-03-18 12:33:30 425
原创 数字三角形
本题解题思路,首先状态表示 f [i , j ] 的含义是所有从起点,走到 ( i , j ) 点的路径。我们可以将金字塔,模拟成一个二维数组。然后我们看每个点是怎么到达的。898. 数字三角形 - AcWing题库#include<iostream>#include<algorithm>using namespace std;const int N=510 , INF = 1e9;int a[N][N];//存储元素...
2022-03-18 09:44:00 156
原创 分组背包问题
分组背包问题:有若干组,每个组中只能选一个物品,求出最大价值。9. 分组背包问题 - AcWing题库 二维数组#include<iostream>using namespace std;const int N=110;int f[N][N];//f[i][j] 考虑前i组,合计体积不超过 j 的最大价值是 f[i][j]int s[N...
2022-03-17 20:26:41 1290
原创 多重背包问题
多重背包问题:就是每个物品都有 有限 个,让我们求出最大价值。那么对于第 i 个物品,也是两种情况。1、不选第 i 个物品,那么 f [ i ] [ j ] = f [ i - 1 ] [ j ] 。2、 选第 i 个物品,那么选 1 个,f [ i - 1 ] [ j - vi ] + wi选 2 个,f [ i - 1 ] [ j - 2vi ] + 2wi……以此类推选 k 个,f [ i - 1 ] [ j - kv...
2022-03-17 18:52:37 721
原创 完全背包问题 详解
完全背包问题:是每个物品有无数个,然后我们选出最大价值。f[ i ] [ j ] :考虑前 i 个物品,总体积不超过 j ,最大价值为 f [ i ] [ j ] 。3. 完全背包问题 - AcWing题库这是朴素算法,但是会TLE.#include<iostream>using namespace std;const int N=1010;int f[N][N];int v[N],w[N];int main(){ int n,m; cin&g..
2022-03-17 16:24:18 1517
原创 01 背包问题 详解
我们可以用 v[ i ] ,w[ i ] 表示 第 i 个物品的 体积 和 价值 。f[ i ] [ j ] 含义是 只考虑前 i 个物品,总体积不超过 j ,最大价值为 f[ i ] [ j ] 。对于每一个i 都有 选 和 不选 两种情况:如果不含 i ,那就是 从前 i - 1 个 选重量不超过 j 的物品,即 f( i , j ) = f( i-1 , j ) ;如果包含 i ,那就是 从前 i - 1 个 选重量不超过 j - vi 的物品 ,即 f( i , j ) = f(..
2022-03-17 15:22:11 493 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人