单调队列 的 实现 (自己瞎编的)
10000多k 5000多ms
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
int a[1000001],b[1000001],index[1000001],n,k;
vector<int> s;
vector<int> l;
void solve_s()
{
int head_index,start=1,medge=0;
for(int i=1;i<=k;++i)
{
while(medge>=start && a[i]<b[medge])
--medge;
b[++medge] = a[i];
index[medge] = i;
if(medge==start)
head_index = i;
}
s.push_back(a[head_index]);
for(int i=k+1;i<=n;++i)
{
if(head_index <= i-k)
head_index = index[++start];
while(medge>=start && a[i]<b[medge])
--medge;
b[++medge] = a[i];
index[medge] = i;
if(medge==start)
head_index = i;
s.push_back(a[head_index]);
}
}
void solve_l()
{
int head_index,start=1,medge=0;
for(int i=1;i<=k;++i)
{
while(medge>=start && a[i]>b[medge])
--medge;
b[++medge] = a[i];
index[medge] = i;
if(medge==start)
head_index = i;
}
l.push_back(a[head_index]);
for(int i=k+1;i<=n;++i)
{
if(head_index <= i-k)
head_index = index[++start];
while(medge>=start && a[i]>b[medge])
--medge;
b[++medge] = a[i];
index[medge] = i;
if(medge==start)
head_index = i;
l.push_back(a[head_index]);
}
}
int main()
{
scanf("%d %d",&n,&k);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
s.clear();
l.clear();
solve_s();
solve_l();
for(int i=0;i<s.size();++i)
printf("%d ",s[i]);
printf("\n");
for(int i=0;i<l.size();++i)
printf("%d ",l[i]);
printf("\n");
return 0;
}