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; }
相关文章推荐
- HDU 3530 Subsequence(单调队列)
- Subsequence(hdu 3530)
- hdu 3530 Subsequence 单调队列
- HDU 3530 Subsequence
- HDU 3530 Subsequence(单调队列)
- Hdu 3530 Subsequence 单调队列
- hdu 3530 Subsequence dp+单调队列
- HDU 3530 --- Subsequence 单调队列
- HDU 3530 Subsequence(单调队列)
- HDU - 3530 Subsequence
- HDU 3530 Subsequence 单调栈应用
- hdu 3530 Subsequence(DP+单调队列优化)
- HDU - 3530 Subsequence
- HDU 3530 Subsequence
- hdu 3530 Subsequence 单调队列 求最长连续区间,满足条件(m<=max-min<=k)
- 【单调队列+尺取】HDU 3530 Subsequence
- HDU-3530 Subsequence(好题)
- HDU 3530 Subsequence(单调队列)
- hdu 3530 SubSequence TwoPoint单调队列维护最值
- hdu 3530 Subsequence 最长的连续子序列,使得 M<=Max-Min<=K