PKU 2823 双端队列特点:
1.队列具有单调性(desc or asc)。
2.只能在对头或队尾进行插入删除操作。
本题维护一个递增和一个递减的两个队列
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
using namespace std;
int a[1000010];
int answer_min[1000010];
int answer_max[1000010];
int main()
{
// freopen("in.txt","r",stdin);
int n;
int k;
int i;
deque<int> min;
deque<int> max;
while (scanf("%d%d",&n,&k)!=EOF)
{
for (i=0; i<n; i++)
scanf("%d",&a[i]);
min.clear();
max.clear();
int index = 0;
for (i=0; i<n; i++)
{
while (!min.empty() && a[min.back()] > a[i] )
min.pop_back();
while (!max.empty() && a[max.back()] < a[i])
max.pop_back();
max.push_back(i);
min.push_back(i);
if (i>=k-1)
{
answer_max[index] = a[max.front()];
answer_min[index] = a[min.front()];
index++;
}
if (!min.empty() && i - min.front() == k-1)
min.pop_front();
if (!max.empty() && i-max.front() == k-1)
max.pop_front();
}
for (i=0; i<index; i++)
{
printf("%d",answer_min[i]);
if (i == index -1)
printf("\n");
else
printf(" ");
}
for (i=0; i<index; i++)
{
printf("%d",answer_max[i]);
if (i == index -1)
printf("\n");
else
printf(" ");
}
}
return 0;
}