| ||||||||||
| ||||||||||
SubsequenceTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4441 Accepted Submission(s): 1457
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
Sample Output
Source
Recommend
| ||||||||||
|
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 100000+10;
int n, m, k;
int a[MAXN];
int add[MAXN], al, ar;
int sub[MAXN], sl, sr;
int main(){
while( EOF != scanf("%d%d%d", &n, &m, &k) ){
int flag=al=sl=0, ans = 0;
ar = sr = -1; /** 队尾指针 */
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
while( sl<=sr && a[sub[sr]]>=a[i] ) sr--;/** min,大于 a[i] 的全部出队 */
sub[++sr] = i; /** push min[flag] */
while( al<=ar && a[add[ar]]<=a[i] ) ar--;/** max,小于 a[i] 的全部出队 */
add[++ar] = i; /** push max[flag] */
while( a[add[al]]-a[sub[sl]]>k ) /** 上界,弹出最左的元素 */
if( add[al]<sub[sl] ) flag = add[al++];
else flag = sub[sl++];
if( a[add[al]]-a[sub[sl]]>=m && i-flag>ans )
ans = i-flag; /** flag , [ flag+1 ... i ] // ans = i-flag */
}
printf("%d\n", ans);
}
return 0;
}