分析:给你n个数字,求有多少个连续的区间,满足区间内的最大值和最小值的差小于k。假如已知前j-1个数满足第j-1个数的最大区间为[i,j-1],区间内的最大值的下标为max,最小值为min,如果第n个数的值介于区间[i,j-1]的最大值和最小值之前,那么区间[x,j](i<=x<=j)都满足条件,如果a[j]比最大值大,更新区间[i,j]的最大值,然后寻找满足区间内的极差小于k的最大区间[i,j],如果a[i]比最小值小同理。
# include <stdio.h>
int a[100005];
int Max(int i,int j)
{
int max;
for(max=i;i<=j;i++)
if(a[i]>a[max])
max=i;
return max;
}
int Min(int i,int j)
{
int min;
for(min=i;i<=j;i++)
if(a[i]<a[min])
min=i;
return min;
}
int main()
{
int i,j,n,k,t,min,max;
__int64 sum;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
min=max=1;sum=0;
for(i=1,j=1;j<=n;j++)
{
scanf("%d",&a[j]);
if(a[j]>a[max])
{
max=j;
while(a[j]-a[min]>=k)
{
i=min+1;
min=Min(i,j);
}
}
else if(a[j]<a[min])
{
min=j;
while(a[max]-a[j]>=k)
{
i=max+1;
max=Max(i,j);
}
}
sum+=j-i+1;
}
printf("%I64d\n",sum);
}
return 0;
}

本文介绍了一个算法问题,即计算给定数字序列中所有满足特定条件(区间内最大值与最小值之差小于k)的连续子区间的数量。通过动态更新区间最大值与最小值的位置,并调整区间范围来实现高效计算。
10万+

被折叠的 条评论
为什么被折叠?



