Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4917 Accepted Submission(s): 1622
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.
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。
思路:首先最大值和最小值的差会随着区间的增大而递增的,所以我们一开始让起点为1,找最远的使得最大值与最小值的差<=k的,超过k之后,我们就把起始点往后移动一个,在继续找。这里用到了单调队列来优化一段区间的最大值和最小值。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int num,pos;
}qu1[100010],qu2[100010],temp;
int T,t,n,m,K,num[100010];
int main()
{
int i,j,k,ans,head1,head2,tail1,tail2,maxn,minn;
while(~scanf("%d%d%d",&n,&m,&K))
{
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
head1=head2=1;
tail1=tail2=0;
j=1;
ans=0;
for(i=1;i<=n;i++)
{
temp.num=num[i];
temp.pos=i;
while(head1<=tail1 && qu1[tail1].num<=num[i])
tail1--;
qu1[++tail1]=temp;
while(head2<=tail2 && qu2[tail2].num>=num[i])
tail2--;
qu2[++tail2]=temp;
while(true)
{
while(head1<tail1 && qu1[head1].pos<j)
head1++;
while(head2<tail2 && qu2[head2].pos<j)
head2++;
maxn=qu1[head1].num;
minn=qu2[head2].num;
if(maxn-minn<m)
break;
else if(maxn-minn<=K)
{
ans=max(ans,i-j+1);
break;
}
else
j++;
}
}
printf("%d\n",ans);
}
}