2 条题解

  • 1
    @ 2025-10-20 8:54:57

    这道题好像因为题面过于简单误导大家了,如果以后遇到TLE且没有新思路的话,建议先跳过,很可能是卡某些算法。

    这道题的正解应该是两遍二分,把每个 ai 作为减数,对应的被减数应该是唯一的,第一遍二分找第一次出现的被减数,第二遍找最后一次出现的被减数,可得到答案。时间复杂度应该是O(nlogn)。有人用桶的方式过了,其实是因为数据没有给到特别大,还是建议大家优先使用二分,这里不再赘述。

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    signed main()
    {
      int n,k;
      cin >> n >> k;
      int ai[n+5]={0};
      for(int i=1;i<=n;i++)
      {
        cin >> ai[i];
      }
    
      int sum=0;
    
      for(int i=1;i<=n;i++)
      {
        int tar=ai[i]+k;
        int l=i-1,r=n+1;
        while(l+1!=r)
        {
          int mid=(l+r)/2;
          if(ai[mid]<tar)
          {
            l=mid;
          }
          else
          {
            r=mid;
          }
        }
        int ll=i-1,rr=n+1;
        while(ll+1!=rr)
        {
          int mid=(ll+rr)/2;
          if(ai[mid]>tar)
          {
            rr=mid;
          }
          else
          {
            ll=mid;
          }
        }
        sum+=(ll-r+1);
      }
      cout << sum << endl;
    }
    

    信息

    ID
    1153
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    354
    已通过
    23
    上传者