-
A - Subsequence
- HDU - 3530
- 题意:给你n,m,k以及一数组,n个元素,求一个序列使得序列里最大值减去最小值>=m且<k,求这个序列的最大长度,序列必须连续。
- 思路:两个单调队列分别维护一个递增序列一个递减序列单调队列里面存储下标即可,每次判断的是到当前i点之前能符合要求的最长子序列,所以让最大最小值相减判断然后让下表小的出队即可一旦跳出不符合的while 从那个不符合的最小下表之后的序列就都符合了,temp初始化为-1 这样多减一个就恰好是序列的长度了。
-
#include<bits/stdc++.h> using namespace std; #define maxn 100005 int a[maxn],n,m,k; int temp,ans; deque<int>maxx,minn; int main() { while(~scanf("%d%d%d",&n,&m,&k)) { ans=0; temp=-1; for(int i=0; i<n; i++) scanf("%d",&a[i]); while(!maxx.empty()) maxx.pop_back(); while(!minn.empty()) minn.pop_back(); for(int i=0; i<n; i++) { while(!maxx.empty()&&a[i]>a[maxx.back()]) maxx.pop_back(); maxx.push_back(i); while(!minn.empty()&&a[i]<a[minn.back()]) minn.pop_back(); minn.push_back(i); while(a[maxx.front()]-a[minn.front()]>k) { temp=min(maxx.front(),minn.front()); if(temp==maxx.front()) maxx.pop_front(); if(temp==minn.front()) minn.pop_front(); } if(a[maxx.front()]-a[minn.front()]>=m) ans=max(ans,i-temp); } printf("%d\n",ans); } return 0; }
A - Subsequence HDU - 单调队列
最新推荐文章于 2021-08-29 21:44:32 发布