来源:POJ2823
这题目真是难理解,琢磨debug半天弄出来
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <deque>
using namespace std;
int n,k;
const int MAXN = 1e6+10;
int a[MAXN];
int Min[MAXN],Max[MAXN];
deque<int>Q1;
deque<int>Q2;
void output(){
cout<<a[Min[1]];
for(int i=2;i<=n-k+1;i++){
cout<<" "<<a[Min[i]];
}
cout<<endl;
cout<<a[Max[1]];
for(int i=2;i<=n-k+1;i++){
cout<<" "<<a[Max[i]];
}
cout<<endl;
}
int main(){
while(scanf("%d%d",&n,&k)!=EOF){
Q1.clear();/* / */
Q2.clear();/* \ */
memset(a,0,sizeof(a));
memset(Min,0,sizeof(Min));
memset(Max,0,sizeof(Max));
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
int i=1;
for(i=1;i<=k-1;i++){
while(!Q1.empty()&&a[Q1.back()]>=a[i]) Q1.pop_back();
Q1.push_back(i);
while(!Q2.empty()&&a[Q2.back()]<=a[i]) Q2.pop_back();
Q2.push_back(i);
}
for(;i<=n;i++){
while(!Q1.empty()&&a[Q1.back()]>=a[i]) Q1.pop_back();
Q1.push_back(i);
while(!Q1.empty()&&Q1.back()-Q1.front()>=k) Q1.pop_front();
while(!Q2.empty()&&a[Q2.back()]<=a[i]) Q2.pop_back();
Q2.push_back(i);
while(!Q2.empty()&&Q2.back()-Q2.front()>=k) Q2.pop_front();
Min[i-k+1]=Q1.front();
Max[i-k+1]=Q2.front();
}
output();
}
return 0;
}