问题:
查询区间的最值
q[]:单调队列,存储数值
p[]:存储下标
下标从1开始
单调队列可以队首队尾出队,队尾进队
队首即为最值(最大值或最小值)
#include <iostream>
#include <cstdio>
#include <stack>
#define ll long long
using namespace std;
const int N=1e6+5;
int a[N],n,k,q[N],p[N];//q队列,p下标
void mi()//严格单调递增求最小值
{
int head=1,tail=0;//head>tail队列为空
for(int i=1;i<=n;i++)
{
while(head<=tail&&a[i]<=q[tail])
tail--;
q[++tail]=a[i];
p[tail]=i;
while(p[head]+k<=i)
head++;
if(i>=k)
printf("%d ",q[head]);
}
printf("\n");
}
void ma()//严格单调递减求最小值
{
int head=1,tail=0;
for(int i=1;i<=n;i++)
{
while(head<=tail&&a[i]>=q[tail])
tail--;
q[++tail]=a[i];
p[tail]=i;
while(p[head]+k<=i)
head++;
if(i>=k)
printf("%d ",q[head]);
}
printf("\n");
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
for(int i=1;i<=n;i++)
cin >> a[i];
mi();
ma();
return 0;
}