滑动窗口
[Toc]
#题外话
本来是不想写这个的,但是看见阿楚姐,一副灵魂出窍的模样还是写了这个
题意
中文不说了
思路
就说最大值了,小的和他差不多
首先我们发现,每一块的最大值,单独拿出来其实就是一个单调上升的序列,所以我们用队列存每一次的最大值即可
#include<iostream> #include<cstdio> using namespace std; const int N =1000010; int n , k; int a[N] , q[N]; int main() { cin >>n>>k; for(int i=0 ;i<n;i++) { cin>>a[i]; } int hh =0,tt=-1 ; for(int i=0;i<n;i++){ if(hh<=tt&&i-k+1>q[hh])hh++; while(hh<=tt&&a[q[tt]]>a[i])tt--; q[++tt] =i; if(i>=k-1)cout<<a[q[hh]]<<" "; } cout<<endl; hh =0,tt=-1 ; for(int i=0;i<n;i++){ if(hh<=tt&&i-k+1>q[hh])hh++; while(hh<=tt&&a[q[tt]]<=a[i])tt--; q[++tt] =i; if(i>=k-1)cout<<a[q[hh]]<<" "; } cout<<endl; }