单调队列的题目。
注意用c++提交,否则容易超时
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e6+9;
struct
{
int data,id;
}que[maxn];
int a[maxn];
int n,k;
void work(int tmp)
{
int st=1,ed=0;
for(int i=1;i<k;i++)
{
while(ed>=st&&que[ed].data*tmp>=a[i]*tmp) ed--;
que[++ed].data=a[i];
que[ed].id=i;
}
for(int i=k;i<=n;i++)
{
while(ed>=st&&que[ed].data*tmp>=a[i]*tmp) ed--;
que[++ed].data=a[i];
que[ed].id=i;
while(i-que[st].id>=k) st++;
printf("%d ",que[st].data);
}
printf("\n");
}
int main()
{
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
work(1);
work(-1);
return 0;
}