Topics
Given two arrays and , both of size , find the number of “good pairs”. A pair is considered “good” if and .
Idea
Using basic arithmetic, transform the condition to:
Compute a new array diff
where diff[i] = A[i] - B[i]
. The problem now reduces to finding pairs such that diff[i] + diff[j] > 0
and .
We can solve above using two pointers at opposite ends technique (sort diff
first). Use two pointers, l
and r
, starting from the beginning and end of the sorted diff
array, respectively. If diff[l] + diff[r] > 0
, then all pairs (l, r), (l+1, r), ..., (r-1, r)
are good pairs. Increment the count
by r - l
and decrement r
(since we accounted for all pairs that end at r
. This is akin to contribution technique). If diff[l] + diff[r] <= 0
, then increment l
to find a larger value that might satisfy the condition.
Time Complexity: for diff
array, sorting and 2 pointers respectively.
Space Complexity: for diff
array
Alternative approach
Binary Search (Less Efficient): For each element diff[i]
, you could use binary search to find the number of elements diff[j]
such that diff[j] > -diff[i]
and .
ll pairs_with_sum_larger_than_0(const vector<int> &arr) {
int n = arr.size();
ll count = 0;
for (int i = 0; i < n; ++i) {
// Find the number of elements greater than -arr[i] in the subarray
// arr[i+1...n-1] Use upper_bound to find the first element > -arr[i]
auto it = upper_bound(arr.begin() + i + 1, arr.end(), -arr[i]);
count += distance(it, arr.end());
}
return count;
}
Code
ll pairs_with_sum_larger_than_0(const vector<int> &arr) {
int n = arr.size();
int l = 0;
int r = n - 1;
int count = 0;
while (l < r) {
// arr[l] + arr[r] <= 0 (reorganized to avoid overflow)
if (arr[l] <= -arr[r]) {
++l;
} else {
count += r - l;
--r;
}
}
return count;
}
void solve() {
int n, x;
cin >> n;
vector<int> diff(n);
for (int i = 0; i < n; ++i)
cin >> diff[i];
for (int i = 0; i < n; ++i) {
cin >> x;
diff[i] -= x;
}
sort(all(diff));
cout << pairs_with_sum_larger_than_0(diff) << "\n";
}