UESTC -- 201 Sliding Window(队列)

来源:互联网 发布:淘宝宝贝介绍图片尺寸 编辑:程序博客网 时间:2024/06/07 04:08

题目大意:给出一个序列,求出每连续k个数字的最大值个最小值;

代码实现:

#include<cstdio>#include<cstring>#include<queue>#include<iostream>using namespace std;const int N=1000005;int min_value[N],max_value[N],value[N],n,k;struct cmp1{    bool operator()(int x,int y){        return value[x]>value[y];    }};struct cmp2{    bool operator()(int x,int y){        return value[x]<value[y];    }};int main(){    while(~scanf("%d%d",&n,&k)){        priority_queue<int,vector<int>,cmp1> q1;        priority_queue<int,vector<int>,cmp2> q2;        int cnt=0;        for(int i=1;i<=n;++i) scanf("%d",&value[i]);        for(int i=1;i<=k;++i){            q1.push(i),q2.push(i);        }        min_value[cnt]=value[q1.top()];        max_value[cnt++]=value[q2.top()];        for(int i=k+1;i<=n;++i){            q1.push(i),q2.push(i);            while(i-q1.top()>=k) //cout<<"i="<<i<<":"<<q1.top()<<"."<<value[q1.top()]<<endl;                q1.pop();            min_value[cnt]=value[q1.top()];            while(i-q2.top()>=k) q2.pop();            max_value[cnt++]=value[q2.top()];        }        printf("%d",min_value[0]);        for(int i=1;i<cnt;++i) printf(" %d",min_value[i]);        printf("\n");        printf("%d",max_value[0]);        for(int i=1;i<cnt;++i) printf(" %d",max_value[i]);        printf("\n");    }}


 

0 0
原创粉丝点击