hdoj--3530 Subsequence(单调队列)

来源:互联网 发布:mac能玩gta5 编辑:程序博客网 时间:2024/05/23 17:55

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    2416Kvoid 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;}
0 0
原创粉丝点击