这一题之前的学习理解因为数据水问题出现了错误的判断,现在补回来
输入/输出
8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7
变量设置 数组长度m,窗口元素个数n,原始数组U【N】,答案数组ans【N】。
尾指针hh,头指针tt,并对其赋初值
我之前的思维是在遍历的时分出来两个if,方法可以
现在我是直接讨论是否满足单调 再判断是否输出
维护单调队列首先对ans数组里存的下标进行判断,如果第一个下标不满足,头指针后移
if(hh<=tt&&i-ans[hh]>n-1) hh++;
答案数组元素满足后在维护一个单调的队列(维护递增为例)
while(hh<=tt&&U[ans[tt]]>=U[i]) tt--;
#include<iostream>
using namespace std;
const int N=1e6+5;
int U[N],ans[N];
int main()
{
ios::sync_with_stdio(false);
int m,n;int hh=1,tt=0;
cin>>m>>n;
for(int i=1;i<=m;i++)
{
cin>>U[i];
if(hh<=tt&&i-ans[hh]>n-1) hh++;
while(hh<=tt&&U[ans[tt]]>=U[i]) tt--;
tt++;ans[tt]=i;
if(i>=n) cout<<U[ans[hh]]<<' ';
}cout<<endl;
hh=1;tt=0;
for(int i=1;i<=m;i++)
{
if(hh<=tt&&i-ans[hh]>n-1) hh++;
while(hh<=tt&&U[ans[tt]]<=U[i]) tt--;
tt++;ans[tt]=i;
if(i>=n) cout<<U[ans[hh]]<<' ';
}cout<<endl;
}