-
单调栈是什么:
- 单调栈就是一个单调递增/递减的栈,每个元素仅入栈一次,例如维护一个递增的单调栈的话,若入栈元素小于栈顶元素就要将栈中小于入栈元素的元素全部pop出去,再push这个元素,这样就在O(n)的复杂度内维护了一个单调栈
-
单调栈能做什么
- 1.最基础的应用就是给定一组数,针对每个数,寻找它和它右边第一个比它大的数之间有多少个数。
- 2.给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列的长度最大。
- 3.给定一序列,寻找某一子序列,使得子序列中的最小值乘以子序列所有元素和最大。
- 应用1对应题目:
-
D - Bad Hair Day
- POJ - 3250
- 题意:cow 可以看见右边strictly shorter严格比他矮的cow 求一下所有cow 能看见的总数
- 思路:维护一个单调递减的栈,入栈元素为结构体(需要保存其高度与位置),遇到当前元素
- 大于等于栈内元素时,栈顶元素开始出栈,出栈是累计结果,因为直到此处是栈内元素所能看见的cow的数量。
- 最后再依次处理一下栈内剩下的元素。它们所能看到的就是一直到结尾了 ,
-
#include<stdio.h> #include<stack> using namespace std; #define ll long long struct node { int id,h; } a; stack<node>stk; ll n,ans; int main() { scanf("%lld",&n); for(int i=1; i<=n; i++) { scanf("%d",&a.h); a.id=i; if(stk.empty()) stk.push(a); else { while(!stk.empty()&&stk.top().h<=a.h) { ans+=i-stk.top().id-1; stk.pop(); } stk.push(a); } } while(!stk.empty()) { ans+=n-stk.top().id; stk.pop(); } printf("%lld\n",ans); return 0; }
D - Bad Hair Day POJ - 3250 -单调栈-第一弹
最新推荐文章于 2021-03-29 19:18:26 发布