hdoj-3530-Subsequence
2016-05-20 15:27
465 查看
Description
There is a sequence of integers. Your task is to find the longest subsequence that satisfies the following condition: the difference between the maximum element and the minimum element of the subsequence is no smaller than m and no larger than k.
Input
There are multiple test cases.
For each test case, the first line has three integers, n, m and k. n is the length of the sequence and is in the range [1, 100000]. m and k are in the range [0, 1000000]. The second line has n integers, which are all in the range [0, 1000000].
Proceed to the end of file.
Output
For each test case, print the length of the subsequence on a single line.
Sample Input
5 0 0
1 1 1 1 1
5 0 3
1 2 3 4 5
Sample Output
5
4
构造两个队列来维护当前的最大值和最小值
There is a sequence of integers. Your task is to find the longest subsequence that satisfies the following condition: the difference between the maximum element and the minimum element of the subsequence is no smaller than m and no larger than k.
Input
There are multiple test cases.
For each test case, the first line has three integers, n, m and k. n is the length of the sequence and is in the range [1, 100000]. m and k are in the range [0, 1000000]. The second line has n integers, which are all in the range [0, 1000000].
Proceed to the end of file.
Output
For each test case, print the length of the subsequence on a single line.
Sample Input
5 0 0
1 1 1 1 1
5 0 3
1 2 3 4 5
Sample Output
5
4
构造两个队列来维护当前的最大值和最小值
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int MAXN=100010; int q1[MAXN],q2[MAXN]; int rear1,head1; int rear2,head2; int a[MAXN]; int main() { int n,m,k; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { rear1=head1=0; rear2=head2=0; int ans=0; int now=1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { while(head1<rear1&&a[q1[rear1-1]]<a[i])rear1--; while(head2<rear2&&a[q2[rear2-1]]>a[i])rear2--; q1[rear1++]=i; q2[rear2++]=i; while(head1<rear1&&head2<rear2&&a[q1[head1]]-a[q2[head2]]>k) { if(q1[head1]<q2[head2])now=q1[head1++]+1; else now=q2[head2++]+1; } if(head1<rear1&&head2<rear2&&a[q1[head1]]-a[q2[head2]]>=m) { if(ans<i-now+1)ans=i-now+1; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- CRM开发要点(四)
- 26.UIWindow
- runOnUiThread在子进程中更新主进程UI
- kxbdSuperMarquee.js滚动的神器-推荐
- EasyUI tree-grid 数回显问题实现探讨
- Qt之统一的UI界面格式基调,漂亮的UI界面
- 高并发集中访问造成连接MYSQL报Cannot assign requested address错误
- iOS学习之—— UICollectionView导致的崩溃问题
- Build path ->No action available/classpath .project 作用
- [疯狂Java]基础类库:StringBuilder/StringBuffer
- UItableview的一些总结
- iOS学习之—— UIGestureRecognizerState的简单了解
- iOS学习之——改变UITabBarController中当前显示的viewController
- Flex builder3 调试弹出窗口Flex builder cannot locate the required version of Flash Player解决办法
- UI
- Android Studio在连接手机时候,出现"Instant Run requires 'Tools..."不能安装软件的问题
- Java--获取request中所有参数的方法
- iOS学习之—— UIVisualEffectView
- mybatis 数据库表中外键关系存在时 useGeneratedKeys="true" keyProperty="id"
- layer-layui