Subsequence
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 29 Accepted Submission(s) : 17
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
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<iostream>
#include<deque>
using namespace std;
int a[500000];
int main(){
ios::sync_with_stdio(false);
int n,m,k;
deque<int>q1;
deque<int>q2;
while(cin>>n>>m>>k){
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(!q1.empty()){q1.pop_front();}
while(!q2.empty()){q2.pop_front();}
int last=0;
int ans=0;
for(int i=1;i<=n;i++){
while(!q1.empty()&&a[i]>=a[q1.back()]){q1.pop_back();}//从大到小
while(!q2.empty()&&a[i]<=a[q2.back()]){q2.pop_back();}//从小到大
q1.push_back(i);
q2.push_back(i);
while(!q1.empty()&&!q2.empty()&&a[q1.front()]-a[q2.front()]>k){ //当q1-q2>k时,重新选择区间
if(q1.front()>q2.front()){ //缩小区间
last=q2.front();
q2.pop_front();
}else{
last=q1.front();
q1.pop_front();
}
}
if(!q1.empty()&&!q2.empty()&&a[q1.front()]-a[q2.front()]>=m){ //满足条件计算值
ans= max(ans,i-last);
}
} cout<<ans<<endl;
}
return 0;
}