HDU 5289 Assignment

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

分析:给你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;
  }


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值