HDU 3530 Subsequence

来源:互联网 发布:敏感资源无法加速 知乎 编辑:程序博客网 时间:2024/06/03 21:29

大意:给出一列数字,以及m和k,求一个最长的序列,使得m<=max-min<=k.求这个最长序列的长度。
做法:单调队列维护最大最小值。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define maxn 1000010struct node{    int num , id;    node(){}    node(int _num , int _id)    {        num = _num;        id = _id;    }}q1[maxn],q2[maxn];int a[maxn];int main(){    int n , k , m ;    while(~scanf("%d%d%d",&n,&m,&k))    {        int head1 , rear1 , head2 , rear2  ;        head1 = rear1 = head2 = rear2 = 0;        q1[0].id = q1[0].num = q2[0].id = q2[0].num = 0;        for(int i = 1 ; i <= n ; i++)        scanf("%d",&a[i]);        int l = 0 , ans = 0;        for(int i = 1 ; i <= n ; i++)        {            while(head1 <= rear1 &&q1[rear1].num > a[i]) rear1--;//递增            q1[++rear1] = node(a[i],i);            while(head2 <= rear2 &&q2[rear2].num < a[i]) rear2--;//递减            q2[++rear2] = node(a[i],i);            while(q2[head2].num - q1[head1].num > k)            l = q2[head2].id < q1[head1].id ? q2[head2++].id : q1[head1++].id;            if(q2[head2].num - q1[head1].num >= m)                ans = max(ans , i - l);        }        printf("%d\n",ans);    }    return 0;}
0 0