题解 P1886 【滑动窗口】
单调队列
关于单调队列这篇博文不错呢
开两组队列(也就是包括两组head和tail)
我的是两翼齐飞两边齐推,但实现大同小异(模板题嘛)
上代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000010],q1[1000010],q2[1000010],head1,tail1,head2,tail2,ans1[1000010],ans2[1000010];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(m==1)
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
head1=1;
tail1=0;
head2=1;
tail2=0;
for(int i=1;i<=n;i++)
{
while(q1[head1]<=i-m)
{
head1++;
}
while(q2[head2]<=i-m)
{
head2++;
}
while(head1<=tail1&&a[q1[tail1]]>a[i])
{
tail1--;
}
q1[++tail1]=i;
while(head2<=tail2&&a[q2[tail2]]<a[i])
{
tail2--;
}
q2[++tail2]=i;
ans1[i]=a[q1[head1]];
ans2[i]=a[q2[head2]];
}
for(int i=m;i<=n;i++)
{
cout<<ans1[i]<<" ";
}
cout<<endl;
for(int i=m;i<=n;i++)
{
cout<<ans2[i]<<" ";
}
}