2 条题解
-
0
- 相向双指针
- 时间复杂度:
- 而且很好写,强烈推荐!!
#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
- 二分做法
- 时间复杂度:
#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
- 上传者