题意:
输入第一行为n和k,第二行有n个数a[0],a[1]...a[n-1]
输出第一行求F[i]=min(a[i-k+1],,,,,,,a[i])
输出第二行求F[i]=max(a[i-k+1],,,,,,,a[i])
解法:
维护一个递增的单调队列,求出最小值的F[i]
维护一个递减的单调队列,求出最大值的F[i]
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<deque>
struct T
{
int num;
int index;
};
using namespace std;
int main()
{
int n,k;
scanf("%d %d",&n,&k);
vector<int>a;
for(int i=0;i<n;i++)
{
int t;
scanf("%d",&t);
a.push_back(t);
}
deque<T>Q;//单调队列
for(int i=0;i<n;i++)
{
while(!Q.empty()&&Q.back().num>a[i])//维护一个递增的单调队列
{
Q.pop_back();
}
T t;
t.index=i;
t.num=a[i];
Q.push_back(t);
while(i-Q.front().index>=k)
{
Q.pop_front();
}
if(i>=k-1&&i==n-1)
{
printf("%d\n",Q.front().num);
}
if(i>=k-1&&i!=n-1)
{
printf("%d ",Q.front().num);
}
}
Q.clear();
for(int i=0;i<n;i++)
{
while(!Q.empty()&&Q.back().num<a[i])//维护一个递减的单调队列
{
Q.pop_back();
}
T t;
t.index=i;
t.num=a[i];
Q.push_back(t);
while(i-Q.front().index>=k)
{
Q.pop_front();
}
if(i>=k-1&&i==n-1)
{
printf("%d\n",Q.front().num);
}
if(i>=k-1&&i!=n-1)
{
printf("%d ",Q.front().num);
}
}
return 0;
}