Subsequence HDU

来源:互联网 发布:plsql随机抽取数据 编辑:程序博客网 时间:2024/06/08 10:59

题意:一个序列中的最大值和最小值的差在m和k之间,求这个序列的最大长度/
用单调队列。

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <queue>#include <vector>using namespace std;int a[100005];int minn[100005],maxx[100005];int main(){    int n,k,m;    while(scanf("%d %d %d",&n,&m,&k)!=EOF){        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        int front1=0,tail1=-1,front2=0,tail2=-1,i=0,ans=0;        int bg=-1;        for(i=0;i<n;i++)        {            while(front1<=tail1&&a[i]>a[maxx[tail1]]) tail1--;            maxx[++tail1]=i;            while(front2<=tail2&&a[i]<a[minn[tail2]]) tail2--;            minn[++tail2]=i;            while(a[maxx[front1]]-a[minn[front2]]>k)            {               bg=min(maxx[front1],minn[front2]);               if(maxx[front1]==bg) front1++;               if(minn[front2]==bg) front2++;            }            if(a[maxx[front1]]-a[minn[front2]]>=m)            {                ans=max(ans,i-bg);            }        }        printf("%d\n",ans);    }    return 0;}

单调队列中的首元素是队列中最小的下标。

原创粉丝点击