首页 > 代码库 > xtu summer individual 5 D - Subsequence

xtu summer individual 5 D - Subsequence

Subsequence

Time Limit: 1000ms
Memory Limit: 32768KB
This problem will be judged on HDU. Original ID: 3530
64-bit integer IO format: %I64d      Java class name: Main
 
 
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 01 1 1 1 15 0 31 2 3 4 5

Sample Output

54

Source

2010 ACM-ICPC Multi-University Training Contest(10)——Host by HEU
 
解题:单调队列!马丹,真蛋疼,第一次搞这个。。。。。
 
 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <vector> 6 #include <climits> 7 #include <algorithm> 8 #include <cmath> 9 #define LL long long10 #define INF 0x3f3f3f3f11 using namespace std;12 const int maxn = 100100;13 int qa[maxn],qb[maxn],h1,h2,t1,t2;14 int n,m,k,d[maxn],lst1,lst2;15 int main(){16     int i,ans;17     while(~scanf("%d %d %d",&n,&m,&k)){18         for(i = 1; i <= n; i++)19             scanf("%d",d+i);20         lst2 = lst1 = h1 = h2 = 0;21         t1 = t2 = -1;22         ans = 0;23         for(i = 1; i <= n; i++){24             while(t1 >= h1 && d[qa[t1]] <= d[i]) t1--;25             qa[++t1] = i;26             while(t2 >= h2 && d[qb[t2]] >= d[i]) t2--;27             qb[++t2] = i;28             while(d[qa[h1]] - d[qb[h2]] > k){29                 if(qa[h1] < qb[h2]){30                     lst1 = qa[h1++];31                 }else lst2 = qb[h2++];32             }33             if(d[qa[h1]] - d[qb[h2]] >= m)34                 ans = max(ans,i-max(lst1,lst2));35         }36         printf("%d\n",ans);37     }38     return 0;39 }40 /*41 5 0 042 1 1 1 1 143 5 0 344 1 2 3 4 545 */
View Code