HDU 3530 单调队列
2016-06-23 20:50
253 查看
点击打开链接
题意:给n个数和m,k,问你数列中最长的子序列,其中最大值减去最小值大于等于m小于等于k
思路:想着想着想到尺取去了,写了一半实现不了((/ □ \)),一看单调队列也没怎么练过,大致就只知道单调队列肯定是维护一个什么东西,只能看大神们的思路了,维护了两个队列,一个是以当前结束所构成的递减序列的位置,另一个是以当前结束构成的递增序列的位置,然后每次的最大值减去最小值,如果大于k,那么就更新两个中的一个,应该更新位置较小的那个,这样才能使得这个区间的长度最大,然后就这么更新就行了 PS:这思想不好想啊
题意:给n个数和m,k,问你数列中最长的子序列,其中最大值减去最小值大于等于m小于等于k
思路:想着想着想到尺取去了,写了一半实现不了((/ □ \)),一看单调队列也没怎么练过,大致就只知道单调队列肯定是维护一个什么东西,只能看大神们的思路了,维护了两个队列,一个是以当前结束所构成的递减序列的位置,另一个是以当前结束构成的递增序列的位置,然后每次的最大值减去最小值,如果大于k,那么就更新两个中的一个,应该更新位置较小的那个,这样才能使得这个区间的长度最大,然后就这么更新就行了 PS:这思想不好想啊
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3fll; const int maxn=100010; int num[maxn],Q1[maxn],Q2[maxn]; int n,m,k; int main(){ while(scanf("%d%d%d",&n,&m,&k)!=-1){ for(int i=1;i<=n;i++) scanf("%d",&num[i]); int s1=0,e1=0,s2=0,e2=0,ans=0,pos=0; for(int i=1;i<=n;i++){ while(s1<e1&&num[Q1[e1-1]]<num[i]) e1--; while(s2<e2&&num[Q2[e2-1]]>num[i]) e2--; Q1[e1++]=i;Q2[e2++]=i; while(s1<e1&&s2<e2&&num[Q1[s1]]-num[Q2[s2]]>k){ if(Q1[s1]<Q2[s2]) pos=Q1[s1++]; else pos=Q2[s2++]; } if(s1<e1&&s2<e2&&num[Q1[s1]]-num[Q2[s2]]>=m) ans=max(ans,i-pos); } printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 1003Max Sum 动态规划 经典题 最大子序列和
- 神经网络和深度学习简史(四):深度学习终迎伟大复兴
- HDU 1231 最大连续子序列
- APP测试点总结(功能,交互,死机崩溃状态分析,容易出错的检查点)
- Jira 安装与破解
- HDU1257 最少拦截系统 贪心算法 (多人乘船问题)水题
- myeclipse10运用git过程
- BZOJ_1616_[Usaco2008_Mar]_Cow_Travelling_游荡的奶牛_(DP)
- A*算法
- 排序 水题
- 讯飞语音开发之语音理解
- HDU 5091 扫描线,线段树
- ViewTreeObserver理解
- 【SpringMVC学习07】SpringMVC中的统一异常处理
- android自定义颜色进度条ColorSeekBar
- BZOJ 2432 兔农
- 简析iOS动画原理及实现——Core Animation
- Android杂谈(6)Windows蓝屏可能出现工程莫名全报错
- 关于inflate导入Layout失真(导入的布局,不是自己想要的)
- 数组类模板