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

hdoj--3530 Subsequence(单调队列)

2016-04-28 16:03 501 查看
hdoj 3530

题意

在一个整数序列中,找到一个最长的子序列,满足该子序列的最大元素与最小元素的差值不小于 m 也不大于 k。

题解

用单调队列维护前 i 个元素的最大和最小值。

参考

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

typedef long long ll;
const int maxn = 100000 + 10;
int   a[maxn];
int   n, m, k;
int   maxQue[maxn], minQue[maxn];

// 109MS    2416K
void solve()
{
int mintail = 0, minhead = 0, maxtail = 0, maxhead = 0;
int ans = 0, st = 0;
for(int i = 0; i < n; ++i){
while(minhead < mintail && a[minQue[mintail - 1]] >= a[i]) --mintail;
minQue[mintail++] = i;
while(maxhead < maxtail && a[maxQue[maxtail - 1]] <= a[i]) --maxtail;
maxQue[maxtail++] = i;

while(a[maxQue[maxhead]] - a[minQue[minhead]] > k){
if(maxQue[maxhead] < minQue[minhead]) st = maxQue[maxhead++] + 1;
else st = minQue[minhead++] + 1;
}
if(a[maxQue[maxhead]] - a[minQue[minhead]] >= m) ans = max(ans, i - st + 1);
}

cout << ans << endl;
}

int main()
{
while(cin >> n >> m >> k){
for(int i = 0; i < n; ++i) scanf("%d", a + i);
solve();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdoj 单调队列