POJ2823(单调队列)

来源:互联网 发布:淘宝网拍卖车辆提档 编辑:程序博客网 时间:2024/04/30 11:40

注意k等于1的情况。

#include <iostream>#include <cstdio>#include <queue>#include <deque>using namespace std;struct s{int pos;int data;}A[1000000];int main(){int n,k;deque<s> Q;scanf("%d%d",&n,&k);int i;for (i=0;i<=n-1;i++){scanf("%d",&A[i].data);A[i].pos=i;}if (n==1){printf("%d\n",A[0].data);printf("%d\n",A[0].data);}else if (k==1){for (i=0;i<=n-2;i++)printf("%d ",A[i].data);printf("%d\n",A[i].data);for (i=0;i<=n-2;i++)printf("%d ",A[i].data);printf("%d\n",A[i].data);}else{    Q.push_back(A[0]);for (i=1;i<=n-1;i++){while (!Q.empty() && Q.front().data>A[i].data)Q.pop_front();while (!Q.empty() && Q.back().data>A[i].data)Q.pop_back();Q.push_back(A[i]);//printf("A:%d\n",A[i]); if (i-Q.front().pos>k-1) Q.pop_front(); if (i==n-1) printf("%d\n",Q.front().data); else if (i>=k-1)printf("%d ",Q.front().data);}Q.clear();        Q.push_back(A[0]);for (i=1;i<=n-1;i++){while (!Q.empty() && Q.front().data<A[i].data)Q.pop_front();while (!Q.empty() && Q.back().data<A[i].data)Q.pop_back();Q.push_back(A[i]);//printf("A:%d\n",A[i]); if (i-Q.front().pos>k-1) Q.pop_front(); if (i==n-1) printf("%d\n",Q.front().data); else if (i>=k-1)printf("%d ",Q.front().data);}}return 0;}


原创粉丝点击