这次是要求连续变化区间内的最大值和最小值,我维护了一个map就ac了…
不过听别人说可以维护一个单调队列,但是效率也并没有高很多 ==
线段树应该是也可以的,不过线段树可能更适用于任意区间的查询、
有空再研究单调队列好了~
#include <iostream>
#include <map>
#include <cstdio>
#include <iterator>
using namespace std;
#define maxn 1000050
int omax[maxn]={0};
int omin[maxn]={0};
int num[maxn]={0};
int main(){
int n,k;
scanf("%d%d",&n,&k);
map<int,int> m;
int loc = 0;
for(int i=0;i<n;++i){
scanf("%d",&num[i]);
}
for(int i=0;i<k;++i){
map<int,int>::iterator myite;
myite = m.find(num[i]);
if(myite!=m.end()){
(*myite).second++;
}
else{
m.insert(make_pair(num[i],1));
}
}
omax[loc] = (*m.rbegin()).first;
omin[loc] = (*m.begin()).first;
loc++;
for(int i=k;i<n;++i){
map<int,int>::iterator myite;
myite = m.find(num[i-k]);
(*myite).second--;
if(!(*myite).second){
m.erase(myite);
}
myite = m.find(num[i]);
if(myite!=m.end()){
(*myite).second++;
}
else{
m.insert(make_pair(num[i],1));
}
omax[loc] = (*m.rbegin()).first;
omin[loc] = (*m.begin()).first;
loc++;
}
for(int i=0;i<loc;++i){
printf("%d ",omin[i]);
}
printf("\n");
for(int i=0;i<loc;++i){
printf("%d ",omax[i]);
}
printf("\n");
//system("pause");
return 0;
}