Subsequence - HDU 3530 单调队列优化
2015-06-09 17:53
351 查看
Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4917 Accepted Submission(s): 1622
Problem 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
题意:找最长的连续区间长度,使得最大值与最小值的差不小于m,不大于k。
思路:首先最大值和最小值的差会随着区间的增大而递增的,所以我们一开始让起点为1,找最远的使得最大值与最小值的差<=k的,超过k之后,我们就把起始点往后移动一个,在继续找。这里用到了单调队列来优化一段区间的最大值和最小值。
AC代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct node { int num,pos; }qu1[100010],qu2[100010],temp; int T,t,n,m,K,num[100010]; int main() { int i,j,k,ans,head1,head2,tail1,tail2,maxn,minn; while(~scanf("%d%d%d",&n,&m,&K)) { for(i=1;i<=n;i++) scanf("%d",&num[i]); head1=head2=1; tail1=tail2=0; j=1; ans=0; for(i=1;i<=n;i++) { temp.num=num[i]; temp.pos=i; while(head1<=tail1 && qu1[tail1].num<=num[i]) tail1--; qu1[++tail1]=temp; while(head2<=tail2 && qu2[tail2].num>=num[i]) tail2--; qu2[++tail2]=temp; while(true) { while(head1<tail1 && qu1[head1].pos<j) head1++; while(head2<tail2 && qu2[head2].pos<j) head2++; maxn=qu1[head1].num; minn=qu2[head2].num; if(maxn-minn<m) break; else if(maxn-minn<=K) { ans=max(ans,i-j+1); break; } else j++; } } printf("%d\n",ans); } }
相关文章推荐
- 关于UIImagePickerController的理解 (区别于上文的AVCapture)
- 关于ExecuteNonQuery()执行成功却返回-1的问题
- iOS中UIActionSheet的使用
- PHP array_count_values()
- UI设计: UI设计的15项黄金法则
- [android][studio] build a project
- Werther Quest 笔记
- IOS 将RGB颜色值转换为UIColor
- Building,Packaging,Deploying,and Administering Applications and Types
- easyui-tabs 刷新当前tab页
- easyui框架搭建
- UITableView 的方法总汇
- (搬运工)NGUI官网示例11 –Drag ; Drop(图标与物体拖拽放置)
- 手写CollectionVeiwCell和UICollectionView
- org.tinygroup.databasebuinstaller-数据库结构及元数据自动创建
- 使用其他的代理工具brup suide
- Diesel uk that will definitely suit your needs
- easyui格式化复选框
- CSS3 Media Query 响应式媒体查询
- GUI使用2——总结&NGUI、tookit2D、GUI比较