您的位置:首页 > 产品设计 > UI/UE

HDU 3530 Subsequence

2015-02-18 16:59 351 查看
大意:给出一列数字,以及m和k,求一个最长的序列,使得m<=max-min<=k.求这个最长序列的长度。

做法:单调队列维护最大最小值。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 1000010
struct 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 单调队列