开始用两个deque做单调队列,用两个queue装答案,结果TLE了(洛谷上有一道明显相同的题,能过),以为poj又有啥问题,后来看见别人用单调队列写的,给他交了,过了,没看见他用deque和queue,于是又重写了一遍,用结构体数组写了一个单调队列,花了5s多,过了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <deque>
#include <stack>
#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
const int maxn=1e6+5;
int N,k,x;
int ma_l,ma_r,mi_l,mi_r;
int ans1[maxn],d1,ans2[maxn],d2;
struct DM
{
int val,id;
}ma[maxn],mi[maxn];
int main()
{
scanf("%d%d",&N,&k);
ma_l=mi_l=1;
for(int i=1;i<=N;i++)
{
scanf("%d",&x);
while(ma_r>=ma_l&&x>ma[ma_r].val)ma_r--;
while(mi_r>=mi_l&&x<mi[mi_r].val)mi_r--;
ma[++ma_r].val=x;
ma[ma_r].id=i;
mi[++mi_r].val=x;
mi[mi_r].id=i;
if(i-ma[ma_l].id+1>k)ma_l++;
if(i-mi[mi_l].id+1>k)mi_l++;
if(i<k)continue;
ans1[++d1]=mi[mi_l].val;
ans2[++d2]=ma[ma_l].val;
}
if(k>=N)//听评论里说k可能大于N
{
printf("%d\n%d\n",mi[mi_l],ma[ma_l]);
return 0;
}
printf("%d",ans1[1]);
for(int i=2;i<=d1;i++)printf(" %d",ans1[i]);
printf("\n");
printf("%d",ans2[1]);
for(int i=2;i<=d2;i++)printf(" %d",ans2[i]);
printf("\n");
return 0;
}