首页 > 代码库 > 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: 353064-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.
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 */
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。