首页 > 代码库 > Subsequence(hdu3530)

Subsequence(hdu3530)

Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6141    Accepted Submission(s): 2041


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
5 0 0
1 1 1 1 1
5 0 3
1 2 3 4 5
 

 

Sample Output
5
4
思路:优先队列+尺取;
我们不用去管这个子串中的最大最小的距离是否大于等于m,我们只要保证这个值小于等于k时继续向右端扩展,应为向右端扩展尺取时,当前值是越来越大的。比如当[l,r]满足dis>=m,那么[l,r+s],的dis>=m;所以我们不需要管m。然后就是尺取中,更新最大最小值的问题,这个用优先队列维护下。复杂度N*log(N);
  1 #include<stdio.h>  2 #include<algorithm>  3 #include<iostream>  4 #include<string.h>  5 #include<stdlib.h>  6 #include<queue>  7 #include<stack>  8 using namespace std;  9 typedef long long LL; 10 int ask[100005]; 11 int cnt[100005]; 12 struct node1 13 { 14     int x; 15     int id; 16     bool operator<(const node1 &cx)const 17     { 18         if(cx.x == x) 19             return cx.id<id; 20         else return cx.x>x; 21     } 22 }; 23 struct node2 24 { 25     int x; 26     int id; 27     bool operator<(const node2 &cx)const 28     { 29         if(cx.x == x) 30             return cx.id<id; 31         else return cx.x<x; 32     } 33 }; 34 priority_queue<node1>que1; 35 priority_queue<node2>que2; 36 int main(void) 37 { 38     int n,m,k; 39     while(scanf("%d %d %d",&n,&m,&k)!=EOF) 40     { 41         while(!que1.empty())que1.pop(); 42         while(!que2.empty())que2.pop(); 43         int i,j; 44         for(i = 0; i < n; i++) 45         { 46             scanf("%d",&ask[i]); 47         } 48         int l = 0; 49         int r = 0; 50         int cc = 0; 51         int ma = ask[0]; 52         int mi = ask[0]; 53         int x = abs(ma-mi); 54         if(x <= k&&x >= m)cc = 1; 55         node1 ak; 56         node2 ap; 57         ak.x =ask[0]; 58         ak.id = 0; 59         ap.x = ask[0]; 60         ap.id = 0; 61         que1.push(ak); 62         que2.push(ap); 63         while(l<=r&&r<n) 64         { 65             while(x <= k &&r < n-1) 66             { 67                 r++; 68                 int c = abs(ask[r]-ma); 69                 c = max(abs(ask[r]-mi),c); 70                 if(c > k) 71                 {   //printf("%d %d\n",l,r); 72                     r--; 73                     break; 74                 } 75                 node1 ac; 76                 ac.x = ask[r]; 77                 ac.id = r; 78                 node2 bc; 79                 bc.x= ask[r]; 80                 bc.id = r; 81                 que1.push(ac); 82                 que2.push(bc); 83                 if(ask[r] > ma) 84                 { 85                     ma = ask[r]; 86                 } 87                 else if(ask[r] < mi) 88                 { 89                     mi = ask[r]; 90                 } 91                 x = abs(ma-mi);//printf("%d\n",x); 92             } 93             if(x >= m) 94             { 95                 cc = max(cc,r-l+1); 96             } 97             if(ask[l] == ma) 98             { 99                 while(!que1.empty())100                 {101                     node1 acc = que1.top();102                     if(acc.id <= l)103                     {104                         que1.pop();105                     }106                     else107                     {108                         ma = acc.x;109                         break;110                     }111                 }112             }113             if(ask[l]==mi)114             {115                 while(!que2.empty())116                 {117                     node2 acc = que2.top();118                     if(acc.id <= l)119                     {120                         que2.pop();121                     }122                     else123                     {124                         mi = acc.x;125                         break;126                     }127                 }128             }129             l++;130             if(l == r+1)131             {   //printf("%d\n",r);132                 r++;133                 node1 akk;134                 node2 app;135                 akk.x =ask[r];136                 akk.id = r;137                 app.x = ask[r];138                 app.id = r;139                 que1.push(akk);140                 que2.push(app);141                 mi = ask[r];142                 ma = ask[r];143             }144         }145         printf("%d\n",cc);146     }147     return 0;148 }

 

 

Subsequence(hdu3530)