poj 2823 Sliding Window 双向队列,学习

来源:互联网 发布:ipad桌面图标整理软件 编辑:程序博客网 时间:2024/04/29 07:44
 
刚刚接触队列!!是在惭愧,仔细研读了别人的代码写的!!!!!
用两个队列分别是q1,q2,一个是维护最大值,一个维护最小值,q1里严格遵守从大到小,q2严格遵守从小到大!!!不断输出q1,q2的队首,就是最大值最小值
#include<iostream>#include<deque>using namespace std;const int x=1000010;int h[x],l[x],a[x];int main(){int n,k;while(scanf("%d%d",&n,&k)!=EOF){for(int i=1;i<=n;i++)scanf("%d",&a[i]);deque<int> q1,q2;q1.clear();q2.clear();for(int i=1;i<=n;i++){while(!q1.empty()&&a[i]>a[q1.back()])q1.pop_back();while(!q1.empty()&&i-k+1>q1.front())q1.pop_front();q1.push_back(i);h[i]=a[q1.front()];while(!q2.empty()&&a[i]<a[q2.back()])q2.pop_back();while(!q2.empty()&&i-k+1>q2.front())q2.pop_front();q2.push_back(i);l[i]=a[q2.front()];}for(int i=k;i<=n;i++){if(i==n)printf("%d\n",l[i]);elseprintf("%d ",l[i]);}for(int i=k;i<=n;i++){if(i==n)printf("%d\n",h[i]);elseprintf("%d ",h[i]);}}return 0;}