- admin's blog
单调栈/单调队列
- @ 2024-1-6 19:40:36
单调栈/单调队列
处理问题
我的理解是: 处理一些相邻大/小值问题
什么意思呢?
比如我记得有一道题,但我忘了题号 形如:
a = 1 2 4 1 2 3 5 8 7 6 b = 0 9 5 4 2 4 3 4 5 1
这样的一个序列,其中每一个a都会向两边进行发射信号,但是只能由第一个比a大的数字接受到,然后获得b的能量,所以我们维护一个单调减的栈就可以了。
具体的:
- 开始栈是空的,1入栈 [1]
- 然后2与栈顶比较,发现2比栈顶高,栈顶出栈,4获得栈顶发射的能量。栈空,2入栈. [2]
- 同理 4>2 ,2出栈4获得2的能量,栈空,4入栈。 [4]
- 1<4,1获取不到4的能量,1入栈 [4,1]
- 2>1,2获取1的能量,1出栈,2<4,2获取不到4的能量,2入栈 [4,2] …… 同理反着就可以将能量向左发射。
~就不放代码了,毕竟这个比较简单~
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+12;
struct node{
int v,h;
}a[N];
int n;
int b[N];
deque<node>q;
int ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].h>>a[i].v;
while( q.size() and a[i].h>q.back().h )
{
b[i]+=q.back().v;
ans=max(ans,b[i]);
q.pop_back();
}
q.push_back(a[i]);
}
q.clear();
for(int i=n;i>=1;i--)
{
while( q.size() and a[i].h>q.back().h )
{
b[i]+=q.back().v;
ans=max(ans,b[i]);
q.pop_back();
}
q.push_back(a[i]);
}
cout<<ans;
}