4 条题解

  • 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-12-6 11:04:13

      c++11思路: 这题其实很简单,如果刷过力扣的应该一眼丁真,就是力扣第一题,用哈希表去映射每个数组

      #include <bits/stdc++.h>
      using namespace std;
      int main(){
          int N,C;
          cin>>N>>C;
          vector <int> v(N,0);
          unordered_map <int,int> mp;//哈希表
          int res = 0;
          int Max = INT_MIN;
          for(int i = 0;i<N;i++){
              cin>>v[i];
              mp[v[i]]++;
              if(Max<=v[i]) Max = v[i];
          }
          for(int i = 1;i<=Max;i++){
              if(mp[i-C]!=0) res += mp[i-C];//遍历每个数组,如果存在这个数,就是直接加上存在这个数的个数就OK了
          }
          cout<<res;
      }
      
      • 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;
        }
        
        • 0
          @ 2025-12-6 21:11:58
          #include<iostream>
          #include<vector>
          using namespace std;
          int main()
          {
              int n,c;
              cin>>n>>c;
              vector<int> nums(1000001);
              vector<int> haxi(10000001);
              for(int i=0;i<n;i++)
              {
                  cin>>nums[i];
                  haxi[nums[i]]++;
                  nums[i]-=c;
              }
              int ans=0;
              for(int i=0;i<n;i++)
              {
                  if(nums[i]>0)
                  {
                  ans+=haxi[nums[i]];
                  haxi[nums[i]]=0;
                  }
              }
              cout<<ans;
              return 0;
          }
          
          • 1

          信息

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