pku 2823 双端队列

来源:互联网 发布:sql delete加标记 编辑:程序博客网 时间:2024/06/05 03:31

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;}