单调队列
就是保持队列中的元素始终保持单调性,这个数据结构就是单调队列
它的作用就是维护最值、求第一个比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; } }