题目大意:给出一个序列,求出每连续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");
}
}