![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
单调栈
keyboarder_zsq
你所认为的极限,其实是别人的起点。
展开
-
单调栈
单调栈与单调队列很相似。首先栈是后进先出的,单调性指的是严格的递增或者递减。 单调栈有以下两个性质: 1、若是单调递增栈,则从栈顶到栈底的元素是严格递增的。若是单调递减栈,则从栈顶到栈底的元素是严格递减的。 2、越靠近栈顶的元素越后进栈。 单调栈与单调队列不同的地方在于栈只能在栈顶操作,因此一般在应用单调栈的地方不限定它的大小,否则会造成元素无法进栈。 元素进栈过程:对于单调递增栈,若当前转载 2016-09-08 20:41:40 · 333 阅读 · 0 评论 -
CodeForces601D【单调栈维护最大值】
思路: 区间最值一定是相邻的差值的绝对值。预处理差值绝对值,预处理以每个位置的值为最大值能延伸的最长距离(单调栈处理)。 然后每次询问就是枚举区间,计算每个值的贡献。//#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <string.h>#include <iostream>#原创 2017-11-29 14:09:07 · 693 阅读 · 0 评论 -
HUST1349 Signal Beacon【单调栈+线段树DP】
题意:有 nn 座山,每座山有一个高度 HiHi,在每座山上安放一个信号塔需要花费CiCi,每座山上的信号塔的信号能传到向左/右离这座塔最近的比他高的山。思路先预处理对每座山的信号塔向左和向右最远的位置[Left,Right][Left,Right],这里利用单调栈就可以了。 将每个区间按照左端点从小到大排序,左端点相等的话,按照右端点从小到大排序。 dp[i]dp[i] 代表从位置 11 到位原创 2017-05-01 19:18:46 · 551 阅读 · 0 评论 -
音乐会的等待【单调栈】
1308: 音乐会的等待时间限制: 1 Sec 内存限制: 128 MB提交: 297 解决: 89[提交][状态][讨论版]题目描述 N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。 写一个程序计算出有多少对人可以互相看见原创 2017-03-10 16:49:50 · 975 阅读 · 0 评论 -
codeforces 547B【单调栈】
题意: 有一个长度为n的序列,序列有长度为1...n的连续子序列,一个连续子序列里面最小的值称作这个子序列的子序列的strength,要求出每种长度的连续子序列的最大的strength。思路:以当前位置为最小值,向两边延伸。那我就能知道这个位置作为最小值时长度。 具体思路忘了。。。给出几组数据希望能有启发?/*101 2 3 4 5 4 3 2 1 6原创 2017-02-20 23:23:20 · 430 阅读 · 0 评论 -
Codeforces631C【栈维护+瞎搞】
题意:百度。思路:如果该查询的R比前面的所有都大,那么前面所有都失效。那么我先预处理出这些有效的。 那最坏的情况不就是栈里面元素(R)很多 n,n-1,n-2,n-3,n-4而且都是相反排序的。。。 总不能每次都那样循环一下,跟着他变吧。所以找特性:如果有序列132456我的栈是1 62 51 32 2那么第一步从sort完:123456原创 2017-02-20 23:17:37 · 534 阅读 · 0 评论 -
HDU 1506【单调栈】
思路:转化成对于某一位置为最小值求向两边最远>=他的位置,用单调栈就能轻易完成。那么ans=(left+right)*h[i];维护单调递增还是递减呢?我们能很快反应到,一旦碰到一个比他小的元素,那么之前的那个比他大的就要结束了。ok,大致了解到碰到比他小的元素,那么比他大的呢?也简单呀,对于比他大的元素,左端点已经找到了呀!那么基于双方考虑,是不是就是维护单调递增栈呢?如果碰到比原创 2017-02-19 22:52:00 · 459 阅读 · 0 评论 -
单调栈萌新讲解
interesting~原创 2016-10-02 10:41:55 · 3311 阅读 · 0 评论 -
Lightoj1083【单调栈】
#include #include #include #include #include using namespace std;typedef long long LL;const int N=5e4+10;struct asd{ LL pre; LL next; LL num;};int n;LL ww[N];int main(){原创 2016-11-21 20:12:24 · 438 阅读 · 0 评论 -
51nod 1102 【单调栈】
思路:对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w;利用单调栈就行了;#include #include #include #include #include using namespace std;typedef long long LL;const int N=5e4+10;struct asd{ LL pre; LL原创 2016-10-31 20:35:59 · 381 阅读 · 0 评论 -
AtCoder Grand Contest 005【A栈模拟,B单调栈】
挖草,AtCoder实在是太吊了~ %%%,目前只A了两题; A题: 就是利用栈模拟一下就好了;S进栈,T的话有S就出栈,然后len减一下就好了;#include <bits/stdc++.h>using namespace std;char s[200020];stack<int>q;int main(){ scanf("%s",s+1); int len=strlen原创 2016-10-01 22:43:50 · 762 阅读 · 0 评论 -
POJ3250【单调栈】
思路: 维护一个单调递增的栈,对于栈顶元素<=新值来说,那么后面的,我一定看不到了,pop掉以后,那么这时候的栈的大小就是我能看到的这个刚刚pop出去元素的个数。//#include <bits/stdc++.h>#include<cstdio>#include<stack>#include<algorithm>using namespace std;typedef long long L原创 2016-09-08 21:58:56 · 565 阅读 · 0 评论 -
POJ2796【单调栈】
题意: 题意:n个数,求某段区间的最小值*该段区间所有元素之和的最大值 思路: 主要参考:http://www.cnblogs.com/ziyi–caolu/archive/2013/06/23/3151556.html 首先我们假设第i个元素是最小的话,那么他的区间是确定的,所以值也是确定的。 然后就是利用栈(单调栈),对于每个位置,搞一个前最远,后最远,然后出栈更新,再入栈。 感觉就原创 2016-09-08 21:30:55 · 807 阅读 · 0 评论 -
HDU 3410【单调栈】
思路:单调栈。鄙人的记忆:按当前为最大值的两边延伸就是维护单调递减栈。//#include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long LL;typedef pair P原创 2017-02-19 22:49:42 · 480 阅读 · 0 评论