POJ2823(單調佇列)
阿新 • • 發佈:2019-01-24
注意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; }