题意
给一个序列,求连续k个序列的最大最小值是什么,类似滑动窗口
思路
用单调队列维护最大值与最小值就可以,惊险卡过????4895??
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=1000000+10;
int maxdq[MAXN],mindq[MAXN];
int maxl,maxr,minl,minr;
int maxans[MAXN],minans[MAXN];
int num[MAXN];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
maxl=maxr=minl=minr=0;
for(int i=0;i<n;i++)
{
while(maxl<maxr&&i-maxdq[maxl]>=k) maxl++;
while(minl<minr&&i-mindq[minl]>=k) minl++;
scanf("%d",&num[i]);
while(maxl<maxr&&num[maxdq[maxr-1]]>=num[i]) maxr--;
maxr++;
maxdq[maxr-1]=i;
while(minl<minr&&num[mindq[minr-1]]<=num[i]) minr--;
minr++;
mindq[minr-1]=i;
maxans[i]=num[maxdq[maxl]];
minans[i]=num[mindq[minl]];
}
for (int i=k-1;i<n;i++) cout<<maxans[i]<<' ';cout<<endl;
for (int i=k-1;i<n;i++) cout<<minans[i]<<' ';cout<<endl;
}
return 0;
}