![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单调栈
ssllyr
锦瑟无端五十弦,一弦一柱思华年。
展开
-
【ROI2018】抄本【RMQ,分治,单调栈】
ST表,RMQ原创 2022-08-20 08:11:59 · 151 阅读 · 0 评论 -
【51nod】最长距离【单调栈】
分析开个结构体记录原始下标,然后排序。保证数字比前面的大。然后维护一个单调递增的栈,每次加进来的数与队首做差值,取max。上代码#include<iostream>#include<cstdio>#include<algorithm>#include<stack>using namespace std;struct node{ int s,p;}a[100001];int cmp(node l,node r){ if(l...原创 2022-01-16 21:04:41 · 117 阅读 · 0 评论 -
【poj】Feel Good【单调栈】
题意给定n个数,求某段区间的最小值*该段区间所有元素之和的最大值Sample Input63 1 6 4 5 2Sample Output603 5分析考虑每个数在哪个区间作为最小值。维护左边和右边第一个比他小的位置。这段的和乘以这个数就是以这个数为最小值时,乘积最大的。取max即可。UVA题库注意在最大值相同时,区间长度尽量小,再次区间左端点位置尽量小。并且多组数据(EOF)以及每两组数据之间要输出一个换行符。我这里没有EOF其他都处理了。上代码#include<i原创 2022-01-16 20:56:19 · 104 阅读 · 0 评论 -
【51nod】移掉k位数字【单调栈】
分析大的数字尽量靠后,但是高位位权高,所以正着枚举。所以只要某个数前面有比他大的都尽量去掉(高位优先),并记录个数。维护一个单调递增的栈。如果都单调递增了k还没用完,那么从后往前删够数。注意去前导0!记录的时候是倒着的,所以倒着输出上代码#include<iostream>#include<algorithm>#include<cstdio>#include<stack>using namespace std;int n,k,a[..原创 2022-01-15 16:56:27 · 157 阅读 · 0 评论 -
【51nod】扔盘子【单调栈】
分析先考虑井的形状,因为下面的会卡在上面,所以井的形状可以处理为单调不增的。然后每放进一个盘子,就判断它能把几个位置弹出并占据。答案加上1,直到栈空。上代码#include<iostream>#include<cstdio>#include<algorithm>#include<stack>using namespace std;int n,m,a[100001],b[100001],ans;stack<int> st;.原创 2022-01-15 16:41:09 · 93 阅读 · 0 评论 -
【CF-817D】Imbalanced Array【单调栈】
题意给你个a序列, 求a序列的任意连续子序列中最大值-最小值的值的和.分析我们考虑每一个数对答案的贡献, 在一段连续的区间中, 这个数要么作为最大值, 要么作为最小值, 这样我们就设l[i]l[i]l[i]是第 iii 个数它往左最大可以到的位置, r[i]r[i]r[i]是 iii 往右最大可以到的位置, 这样答案就加上 ans+=a[i]×(i−L[i])×(R[i]−i)ans += a[i] ×(i - L[i])×(R[i] - i )ans+=a[i]×(i−L[i])×(R[i]−i).原创 2022-01-15 16:16:07 · 143 阅读 · 0 评论 -
【poj2559】 最大矩形面积【单调栈】
题意给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围分析维护一个单调递增的栈,每次最大宽度都是第一个(栈顶)到最后一个,如果当前值大直接放进去。每次记录乘积。上代码#include<iostream>#include<cstdio>#include<algorithm>#include<st原创 2022-01-15 16:01:01 · 158 阅读 · 0 评论 -
【SSL2882】 排队【单调栈】
分析单调找求右边第一个大于等于它的数,记录位置差值上代码#include<iostream>#include<cstdio>#include<algorithm>#include<stack>using namespace std;stack<int> st;long long n,a[100001],ans,t[100001];int main(){ cin>>n; for(int i=1;i<.原创 2022-01-15 15:56:13 · 112 阅读 · 0 评论 -
【51 nod-2500】后面第一个大于【单调栈】
分析题意:问序列中右边第一个比他大的数比他靠后几个位置。从后往前做,维护单调递增的队列。因为如果一个数又小又靠后,这个数没有用。上代码#include<iostream>#include<cstdio>#include<algorithm>#include<stack>using namespace std;stack<int> st;int n,t[30001],ans[30001];int main(){ .原创 2022-01-13 09:26:11 · 131 阅读 · 0 评论 -
【8.16模拟赛.7232】【洛谷P7416】[USACO21FEB] No Time to Dry P【树状数组】【单调栈】
题目链接:https://www.luogu.com.cn/problem/P7416分析上代码#include<iostream>#include<cstdio>#include<algorithm>#include<vector>#include<cmath>#define re registerusing namespace std;vector <pair<int,int> > e[2000.原创 2021-08-18 14:55:39 · 81 阅读 · 0 评论 -
【poj2796】Feel Good【单调栈】
题目大意n 个数,求某段区间的最小值 ×该段区间所有元素之和的最大值。原题&样例分析在开头做一个前缀和,然后往左和右扩展,记录它在哪个区间内为最小值,最后直接计算最小的 × 总和有没有大于答案,然后比较每个区间,更新最大值。上代码#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>typedef long long ll;//十年OI一场空原创 2020-08-12 22:13:31 · 104 阅读 · 0 评论 -
【poj3494】Largest Submatrix of All 1’s【单调栈】
题目大意给出一个只有0和1的n∗mn*mn∗m矩阵,求出面积最大的只含有1的子矩阵。原题&样例分析这题就是例题2的升级版,把一维变成二维了。这题用了压行的思想,把多行压成一行。我们可以按列求高度,将每个点的高度赋值到数组里接下来,我们用两个循环来做,一个枚举行,一个枚举列,在两者之间做单调栈,弹出时记录一下它能到达最左边和最右边的编号,在求面积时和当前高度相乘更新答案。上代码#include<iostream>#include<cstdio>#includ原创 2020-08-12 20:27:08 · 122 阅读 · 1 评论 -
【洛谷CF-817D】Imbalanced Array【单调栈】
题目大意对于给定由 n 个元素构成的数组。一个子数组的不平衡值是这个区间的最大值与最小值的差值。数组的不平衡值是它所有子数组的不平衡值的总和。以下是数组[1,4,1]不平衡值为9的例子,共有6个子序列:[1] (从第一号到第一号)不平衡值为 0;[1, 4] (从第一号到第二号), 不平衡值为 3;[1, 4, 1] (从第一号到第三号),不平衡值为 3;[4] (从第二号到第二号),不平衡值为 0;[4, 1] (从第二号到第三号),不平衡值为 3;[1] (从第三号到第三号)不平衡值为原创 2020-08-12 15:32:55 · 249 阅读 · 1 评论 -
【poj2559】直方图中的最大矩形【单调栈】
题目大意给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。下图中阴影部分为最大矩形。原题&样例分析建立一个单调递增栈,所有元素各进栈和出栈一次即可。每个元素出栈的时候打擂台更新最大的矩形面积。我们需要维护一个二元组(也就是struct中的两个变量),一个存高,一个存宽。因为一个矩形的宽度不仅是向右延伸,也会向左延伸,所以就用一个tm原创 2020-08-12 09:39:17 · 209 阅读 · 0 评论 -
【ssl2882】排队【单调栈模板】
Descriptionn个人排成一条直线(一排),给出队伍中每个人的身高,每个人只能看到站在他右边且个头比他小没有被其他人挡住(跟他身高相同也会挡出他)的人。请求出所有人可以看到的人数之和。1<=N<=80,000Sample Input6 10374122Sample Output5分析这题就是单调栈的模板题。先来讲一下单调栈。1、定义单调栈是一种特殊的栈,其栈内的元素都保持一个单调性(单调递增或者递减)。单调递增栈,从栈底到栈顶依次递增(单调非递原创 2020-08-11 22:03:49 · 261 阅读 · 0 评论