题解 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]<<" ";
    }
}
posted @ 2019-02-11 22:18  G_A_TS  阅读(420)  评论(0)    收藏  举报