這次是要求連續變化區間內的最大值和最小值,我維護了一個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;
}