单调队列

就是保持队列中的元素始终保持单调性,这个数据结构就是单调队列

它的作用就是维护最值、求第一个比i小(大)的数的下标等等

还有个单调栈来着,不过我们可以用一个双端队列就足够了

如果要维护最大值,就用单调递减队列,反之,用递增队列

1、hdu3530 Subsequence 单调队列入门题

这题求的是最大值减去最小值不小于m不大于k的最长长度

这题用单调队列维护最大值和最小值即可

#include<iostream>
using namespace std;
#define MAX 1000005
int a[MAX],deq1[MAX],deq2[MAX];
int Min[MAX],Max[MAX];
int n,m,k;
int main()
{
    while(cin>>n>>m>>k){
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int head1=0,tail1=0;
    int head2=0,tail2=0;
    int ans=0;
    int now=1;
    for(int i=1;i<=n;i++)
    {
        while(head1<tail1&&a[deq1[tail1-1]]<a[i]) tail1--;
        while(head2<tail2&&a[deq2[tail2-1]]>a[i]) tail2--;
        deq1[tail1++]=i;
        deq2[tail2++]=i;
        //cout<<head1<<head2<<endl;
           while(head1<tail1&&head2<tail2&&a[deq1[head1]]-a[deq2[head2]]>k)
            {
                if(deq1[head1]<deq2[head2])now=deq1[head1++]+1;
                else now=deq2[head2++]+1;
            }
            if(head1<tail1&&head2<tail2&&a[deq1[head1]]-a[deq2[head2]]>=m)
            {
                if(ans<i-now+1)ans=i-now+1;
            }
    }
    cout<<ans<<endl;
    }
}
hdu3530

相关文章:

  • 2021-10-02
  • 2021-11-28
猜你喜欢
  • 2021-07-24
  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2021-11-07
  • 2021-06-04
  • 2021-09-07
相关资源
相似解决方案