http://poj.org/problem?id=2823
先是用stl里的deque结果TLE了,然后手工实现deque,5000MS AC了
#include <iostream>
using namespace std;
const int MAX_N = 1e6+1;
int N, K;
int a[MAX_N];
int que[MAX_N][2], front, tail;
void insert(int i, int mod)
{
if(mod == 0)
while(front < tail && a[i] < que[tail-1][0]) tail--;
else
while(front < tail && a[i] > que[tail-1][0]) tail--;
que[tail][0] = a[i];
que[tail++][1] = i;
}
int main()
{
//freopen("in.txt", "r", stdin);
while(scanf("%d%d", &N, &K) != EOF)
{
for(int i = 0; i < N; i++)
scanf("%d", &a[i]);
for(int mod = 0; mod < 2; mod++)
{
front = tail = 1;
que[front][1] = 0;
for(int i = 0; i < N; i++)
{
insert(i, mod);
if(i >= K-1)
{
while(que[front][1] < i-K+1) front++;
printf(i != N-1 ? "%d " : "%d\n", que[front][0]);
}
}
}
}
return 0;
}