2 条题解

  • 0
    @ 2025-11-18 12:23:03
    • 相向双指针
    • 时间复杂度:O(n)O(n)
    • 而且很好写,强烈推荐!!
    #include <bits/stdc++.h>
    using namespace std;
    
    using i64 = long long;
    
    i64 solve(vector<int>& a, int m) {
        int n = a.size();
        i64 ans = 0;
    
        for (int l = 0, r = n; l < n; l++) {
            // a[r] 是最小的数使得 a[l] + a[r] >= m
            r = max(r, l + 1);
            while (r - 1 > l && a[r - 1] + a[l] >= m) r--;
            ans += n - r;
        }
        return ans;
    }
    
    int main() {	
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        
        int n, m;
        cin >> n >> m;
        vector<int> a(n);
        for (int i = 0; i < n; i++) cin >> a[i];
        cout << solve(a, m) << '\n';
    
        return 0;
    }
    
    • 0
      @ 2025-11-18 12:19:41
      • 二分做法
      • 时间复杂度:O(nlog(n))O(nlog(n))
      #include <bits/stdc++.h>
      using namespace std;
      
      using i64 = long long;
      
      i64 solve(vector<int>& a, int m) {
          int n = a.size();
          i64 ans = 0;
      
          for (int l = 0; l < n; l++) {
              // a[r] 是最小的数使得 a[l] + a[r] >= m
              int r = lower_bound(a.begin() + l + 1, a.end(), m - a[l]) - a.begin();
              ans += n - r;
          }
          return ans;
      }
      
      int main() {	
          ios::sync_with_stdio(false);
          cin.tie(0); cout.tie(0);
          
          int n, m;
          cin >> n >> m;
          vector<int> a(n);
          for (int i = 0; i < n; i++) cin >> a[i];
          cout << solve(a, m) << '\n';
      
          return 0;
      }
      
      • 1

      信息

      ID
      182
      时间
      100ms
      内存
      32MiB
      难度
      7
      标签
      递交数
      146
      已通过
      38
      上传者