2823 -- Sliding Window (poj.org)
【!!!警惕自己的!!!】
是双端队列!!!!
求区间最大时,队列是从头到尾递减的
求区间最小时,队列是从头到尾递增的
注意相等的情况也是要pop_back()的!!
以及
summit code 时用G++,不然超时
用cout不用printf,不然超时
不要取消同步,不然 Presentation error
#include<iostream>
#include<cstdio>
#include<deque>
using namespace std;
int a[1000005];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
deque<int> q;
int n,k;
int main()
{
n=read();k=read();
for(int i=0; i<n; i++){
a[i]=read();
}
for(int i=0; i<n; i++){//min q upup
if(!q.empty()&&q.front()<=i-k)q.pop_front();
while(!q.empty()&&a[i]<=a[q.back()])q.pop_back();//=!
q.push_back(i);
if(i>=k-1)cout<<a[q.front()]<<" ";
}
q.clear();
puts("");
for(int i=0; i<n; i++){//max q downdown
if(!q.empty()&&q.front()<=i-k)q.pop_front();
while(!q.empty()&&a[i]>=a[q.back()])q.pop_back();//=!
q.push_back(i);
if(i>=k-1)cout<<a[q.front()]<<" ";
}
return 0;
}