思路
应该是单调队列的板子题吧。我用的是双向队列deque(可能会比较慢)。
原理很简单,对于需要输出大的那个数的队列,比较最后的元素是否比新加入的数小,
是的话就弹出最后的元素,重复此操作,最终得到一个单调递增的队列。
如果队首的元素滑出窗口了,那么直接pop掉,对另外一个队列也是同理。
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; deque<int>big,sml; int n,k,num[maxn]; int main(){ cin>>n>>k; for(int i=1;i<=n;i++) cin>>num[i]; for(int i=1;i<=n;i++){ while(!big.empty()&&num[big.front()]>num[i]) big.pop_front(); big.push_front(i); if(big.back()<=i-k) big.pop_back(); if(i>=k) cout<<num[big.back()]<<" "; } cout<<endl; for(int i=1;i<=n;i++){ while(!sml.empty()&&num[sml.front()]<num[i]) sml.pop_front(); sml.push_front(i); if(sml.back()<=i-k) sml.pop_back(); if(i>=k) cout<<num[sml.back()]<<" "; } return 0; }