单调队列和单调栈就是在暴力的基础上进行优化,把永远用不到的元素删除。
简而言之 就是比你好而且还在你后面的数你永远无法超越他。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=5e5+10;
int q[N],a[N];//q存队列下标
int tt=-1,hh;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{ if(i-k+1>q[hh]) ++hh;//如果长度大于k 队头
while( hh<=tt && a[i]<=a[q[tt]])
tt--; //不为空,并且如果i比队尾小,那么队尾不会用到
q[++tt]=i;//进队
if(i+1>=k) cout<<a[q[hh]]<<" ";// 输出
}
cout<<endl;
hh=0;tt=-1;//重置
for(int i=0;i<n;i++)
{
if(i-k+1>q[hh]) ++hh;
while(hh<=tt &&a[i]>=a[q[tt]])
tt--;
q[++tt]=i;
if(i-k+1>=0 ) cout<<a[q[hh]]<<" ";
}
}
标签:队列,tt,++,int,hh,滑动,单调
From: https://blog.csdn.net/hui_le4/article/details/140122879