这道题应该有三种解法
1:线段树
2:单调队列
3:ST算法
下面的代码是
#include <iostream>
#include<stdio.h>
using namespace std;
struct elem
{
int pos;
int val;
};
elem maxqueue[1000005];
elem minqueue[1000005];
int maxn[1000005];
int minn[1000005];
int minhead,mintail;
int maxhead,maxtail;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
minhead=mintail=maxhead=maxtail=0;
int i;
int num;
for(i=0;i<k;i++)
{
scanf("%d",&num);
while(maxhead<maxtail&&maxqueue[maxtail-1].val<num)
{
maxtail--;
}
maxqueue[maxtail].val=num;
maxqueue[maxtail].pos=i;
++maxtail;
while(minhead<mintail&&minqueue[mintail-1].val>num)
{
mintail--;
}
minqueue[mintail].val=num;
minqueue[mintail].pos=i;
++mintail;
}
int current=0;
for(i=k;i<n;i++)
{
scanf("%d",&num);
maxn[current]=maxqueue[maxhead].val;
minn[current]=minqueue[minhead].val;
//cout<<maxn[current]<<" "<<minn[current]<<endl;
++current;
while(maxhead<maxtail&&i-maxqueue[maxhead].pos>=k)
maxhead++;
while(maxhead<maxtail&&maxqueue[maxtail-1].val<num)
maxtail--;
maxqueue[maxtail].val=num;
maxqueue[maxtail].pos=i;
maxtail++;
while(minhead<mintail&&i-minqueue[minhead].pos>=k)
minhead++;
while(minhead<mintail&&minqueue[mintail-1].val>num)
mintail--;
minqueue[mintail].val=num;
minqueue[mintail].pos=i;
mintail++;
}
maxn[current]=maxqueue[maxhead].val;
minn[current]=minqueue[minhead].val;
current++;
for(i=0;i<current;i++)
{
cout<<minn[i]<<" ";
}
cout<<endl;
for(i=0;i<current;i++)
{
cout<<maxn[i]<<" ";
}
cout<<endl;
}