题解
原题等价于求以 \(i,(i>=k)\) 为右端点,长度为 \(k\) 的区间内的最大元素 \(\to\)
由于维护的区间是定值,所以我们可以用单调队列维护,单调队列中保证元素大小从头到尾降序,且下标升序
这样一来,我们便可以保证下标在指定范围内,然后取最大值也只需要 \(O(1)\) 的时间复杂度
code
#include<bits/stdc++.h>
using namespace std;
int a[2000005];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
deque<int> q;
for(int i=1;i<=n;i++)
{
if(i>k&&i-q.front()>=k)q.pop_front();
while(q.size()&&a[q.back()]<=a[i])q.pop_back();
q.push_back(i);
if(i>=k)cout<<a[q.front()]<<endl;
}
return 0;
}
标签:P2032,原题,int,扫描,&&,front,下标
From: https://www.cnblogs.com/pure4knowledge/p/18064228