AcWing 154. 滑动窗口(单调队列 单调栈的做法+双端队列deque维护队头index在区间范围内)
原题链接
简单
作者:
仅存老实人
,
2020-10-02 22:13:37
,
所有人可见
,
阅读 407
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1000010;
int n,k;
int w[N],res[N][2];
typedef pair<int,int> PII;
int main()
{
cin >> n >> k;
for(int i=0;i<n;i++) cin >> w[i];
deque<PII> q1,q2;
for(int i=0;i<n;i++)
{
if(q1[0].first<=i-k) q1.pop_front();
while(q1.size() && q1.back().second<w[i]) q1.pop_back();
if(q2[0].first<=i-k) q2.pop_front();
while(q2.size() && q2.back().second>w[i]) q2.pop_back();
q1.push_back({i,w[i]}),q2.push_back({i,w[i]});
if(i>=k-1)
{
res[i][0] = q1[0].second;
res[i][1] = q2[0].second;
}
}
for(int i=k-1;i<n;i++) cout << res[i][1] << ' ';
cout << endl;
for(int i=k-1;i<n;i++) cout << res[i][0] << ' ';
return 0;
}