区间最值:
题解:
本题需要维护一个优先队列,队首小于当前元素就把之前的全pop,并压入,同时pop掉超时的元素,这样就可以保证队首永远是最大最新的
代码:
#include<bits/stdc++.h>
using namespace std;
int n,w;
struct node{
int time,num;
}a[1000001];
queue<node> q;
int main(){
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++){
scanf("%d",&a[i].num);
a[i].time=i;
}
for(int i=1;i<=n;i++){
if(a[i].num<q.front().num){
int len=q.size();
for(int j=1;j<=len;j++){
q.pop();
}
q.push(a[i]);
}
if(q.front().time<=i-w) q.pop();
q.push(a[i]);
if(i>=w) printf("%d ",q.front().num);
}
printf("\n");
for(int i=1;i<=n;i++){
if(a[i].num>q.front().num){
int len=q.size();
for(int j=1;j<=len;j++){
q.pop();
}
q.push(a[i]);
}
if(q.front().time<=i-w) q.pop();
q.push(a[i]);
if(i>=w) printf("%d ",q.front().num);
}
return 0;
}