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; }
相关文章推荐
- 浅谈单调队列、单调栈
- 2015 Multi-University Training Contest 6 Solutions
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- Sum Problem
- HDOJ 1009
- HDOJ 1001 递归方法
- HDOJ 1002 C语言版
- HDOJ 1003题解
- sjtu online judge 1034 二哥的金链
- Big Number
- hdoj 2036 改革春风吹满地
- hdu 3076 ssworld VS DDD 概率dp
- hdu5007 ACM-ICPC 西安赛区网赛A题 水题
- hdu5011 西安邀请赛E题 Game 博弈论
- hdu5012 ACM-ICPC 西安赛区E题 Dice
- hdoj2029 Palindromes _easy version
- hdoj 2031 进制转换
- hdoj 2033 人见人爱
- hdoj 1874 畅通工程 vector邻接表测试
- 最小生成树——HDOJ 1233 还是畅通工程 解题报告