单调栈
。十二。
这个作者很懒,什么都没留下…
展开
-
【51 Nod】1272 最大距离【单调栈】
解题思路考虑用单调栈做这道题,先将数组按数值从大到小排序(带着原本的坐标排)。注意相同的数坐标大的放前面。然后把新序列的坐标按顺序放进单调栈(单调递增),当新加入的数大于栈顶,就踢出栈顶,同时更新答案 ans=max(ans,st[1]−st[t]);ans=max(ans,st[1]-st[t]);ans=max(ans,st[1]−st[t]);PS:样例5 3 6 3 4 2,排完序的坐标为,3 1 5 4 2 6.其中5>25>25>2,且5−2=35-2=35−2=3..原创 2022-01-15 14:02:05 · 112 阅读 · 0 评论 -
【POJ 3494】Largest Submatrix of All 1’s【单调栈】
解题思路参照 Largest Rectangle in a Histogram那道题,这道题算是一个升级版,也就是二维的。预处理每一列中每个位置上矩阵的高,记为f,设1为一个单位高度,样例如下图:然后枚举矩阵内每个点,相当于以每一行为低,f[]i[j],为那一位上的高,然后用单调栈算这一行为底能组成的最大的面积代码#include<iostream>#include<cstdio>#include<iomanip>#include<cmath..原创 2022-01-15 13:35:08 · 148 阅读 · 0 评论 -
【POJ 2007】Scrambled Polygon【单调栈】
解题思路先预处理一个前缀和s[i]做两次单调栈,设m1[i]m1[i]m1[i]表示以i为最小值向左碰到的第一个最小值,m2[i]m2[i]m2[i]表示以i为最小值向右碰到的第一个最小值。做两次单调栈分别算出m1,m2m1,m2m1,m2,则点i的最大贡献为(s[m1[i]−1]−s[m2[i]])∗a[i].(s[m1[i]-1]-s[m2[i]])*a[i].(s[m1[i]−1]−s[m2[i]])∗a[i].,取maxmaxmax就好了。注意一下细节,具体看代码代码#includ...原创 2022-01-15 12:58:03 · 65 阅读 · 0 评论 -
【51 Nod】1279 扔盘子【单调栈】
解题思路盘子落下的过程中,若较窄的能通过,则后面更宽的肯定也可以,则先维护一个从井口到井底的单减的序列。然后从井底往上依次判断能否通过,扔盘子顺序固定,所以前面到不了的后面的盘子肯定也到不了。注意最后填到井口了要及时退出。代码#include<bits/stdc++.h>#define ll long longusing namespace std;ll n,m,t,ans,a[50010],b[50010],st[50010];int main(){ scanf...原创 2022-01-14 12:09:11 · 122 阅读 · 0 评论 -
【51 Nod】2491 移掉K位数字【单调栈】
解题思路我们想让剩下的数越小越好,且前面的数能最小最好。则维护一个单调上升的序列,遇到一个比栈顶小的数就弹出栈顶,即删除它,然后直到栈顶小于当前数。注意删掉的数量不能大于k,还有最后输出不能有前导零。(如果删完了或最后只剩一个零就单输出一个)代码#include<bits/stdc++.h>#define ll long longusing namespace std;string s;int ok,n,k,t,a[10010],st[10010];int main..原创 2022-01-14 12:03:53 · 127 阅读 · 0 评论 -
【51 Nod】2478 小b接水【单调栈】
解题思路我们考虑每个位置上有多少水。当一个位置左右都存在高于他的积木时,他的上面才会有水。所以一个位置上水的最高高度为 min(左边中大于它的最高的,右边中大于它的最高的)−a[i]min(左边中大于它的最高的,右边中大于它的最高的)- a[i]min(左边中大于它的最高的,右边中大于它的最高的)−a[i]代码#include<bits/stdc++.h>#define ll long longusing namespace std;int n,t,ans,a[50010]..原创 2022-01-13 21:59:27 · 97 阅读 · 0 评论 -
【51 Nod】后面第一个大于【单调栈】
解题思路维护一个单调递增的单调栈,即从栈顶到栈低是单调递增的。若新加入的大于栈顶,则从栈顶弹出那些小于新加入的,那些被弹出的的“后面第一个大于”就是这个新加入的数。最后不要忘记加入。代码#include<bits/stdc++.h>#define ll long longusing namespace std;int n,a[30010],ans[30010],st[30010],t;int main(){ scanf("%d",&n); for(int i=..原创 2022-01-13 21:55:22 · 83 阅读 · 0 评论 -
【POJ 2796】Feel Good【单调栈+前缀和】
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 24669 Accepted: 6698Case Time Limit: 1000MS Special JudgeDescriptionBill is developing a new mathematical theory for human emotions. His recent investigations are dedicated to studying how g原创 2020-08-12 16:14:05 · 80 阅读 · 0 评论 -
【POJ 3494】Largest Submatrix of All 1’s【单调栈】
Time Limit: 5000MS Memory Limit: 131072KTotal Submissions: 10513 Accepted: 3703Case Time Limit: 2000MSDescriptionGiven a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest we mean that the submatrix has the most原创 2020-08-12 15:18:14 · 72 阅读 · 0 评论 -
【洛谷 CF817D】 Imbalanced Array【单调栈(类型三)】
题目描述You are given an array aa consisting of nn elements. The imbalance value of some subsegment of this array is the difference between the maximum and minimum element from this segment. The imbalance value of the array is the sum of imbalance values of a原创 2020-08-12 11:05:37 · 292 阅读 · 0 评论 -
Largest Rectangle in a Histogram【单调栈(类二)】
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 36011 Accepted: 11763DescriptionA histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. Fo原创 2020-08-12 08:23:16 · 183 阅读 · 0 评论 -
排队【单调栈(类一)】
Time Limit:10000MS Memory Limit:65536KTotal Submit:5 Accepted:2Case Time Limit:1000MSDescriptionnnn个人排成一条直线(一排),给出队伍中每个人的身高,每个人只能看到站在他右边且个头比他小没有被其他人挡住(跟他身高相同也会挡出他)的人。请求出所有人可以看到的人数之和。1<=N<=80,0001<=N<=80,0001<=N<=80,000Sample Inpu原创 2020-08-11 19:40:43 · 290 阅读 · 0 评论