2 条题解

  • 3
    @ 2025-10-20 10:11:34
    桶的思想
    int brr[1000009];
    int main(
    int n,k;
      cin>>n>>k;
      int arr[n+9]={0};
     
      for(int i=1;i<=n;i++)
      {
        cin>>arr[i];
        brr[arr[i]]++;
    //用桶记录每个元素一共有多少个
      }
      int t=0;
      for(int i=1;i<=n;i++)
      {
      t+=brr[arr[i]+k];
    //加上我们要的值的个数
      }
      cout<<t<<'\n';
    return 0;
    }
    
    • 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;
      }
      
      • 1

      信息

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