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

hdu 3530 Subsequence(单调队列)

2017-08-16 17:20 507 查看
http://acm.hdu.edu.cn/search.php?action=listproblem

题目是要求一段区间内最大值与最小值的差不低于m不超过k,那么维护一个递增的单调队列和一个递减的单调队列。凡是差值超过k的就往前挪动,满足条件之后每次得到的一个区间,如果符合差值不低于m的条件,更新区间长度的ans值就行了。

#include<iostream>
using namespace std;
#define maxn 100010
int n,m,k,q_max[maxn],q_min[maxn],a[maxn];
int main()
{
while(cin>>n>>m>>k)
{
for(int i=1;i<=n;i++)
cin>>a[i];
int l1=0,r1=0,l2=0,r2=0,ans=0,pos=0;
for(int i=1;i<=n;i++)
{
while(r1>l1&&a[q_max[r1-1]]<=a[i])          //维护一个递减的单调队列
r1--;
q_max[r1++]=i;
while(r2>l2&&a[q_min[r2-1]]>=a[i])          //维护一个递增的单调队列
r2--;
q_min[r2++]=i;
while(r1>l1&&r2>l2&&a[q_max[l1]]-a[q_min[l2]]>k)    //如果max-min>k 每次更新位置较小的那一个
{
if(q_max[l1]<q_min[l2])
pos=q_max[l1++];
else
pos=q_min[l2++];
}
if(r1>l1&&r2>l2&&a[q_max[l1]]-a[q_min[l2]]>=m)     //比较每次符合max-min>=m条件的区间大小 更新ans值
ans=max(ans,i-pos);
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: