题目:https://codeforces.com/contest/1324/problem/D
描述:一道二分查找的入门小题,使用暴力方法解一定会超时。可以把题目的要求 ai + aj > bi + bj 转化为 ci > cj ,从而使我们能对 c 排序之后使用二分查找来解决。这里有一个点是要求 i < j ,意思就是不要有重复的 pair 。
思路参考:https://www.cnblogs.com/ZJK132/p/12509779.html
C++的二分查找往往要用到 lower_bound() 以及 upper_bound()。这里是函数的用法。
#include<iostream>
#include<algorithm>
using namespace std;
int a[200005], b[200005], c[200005];
int main() {
int n;
long long ans = 0;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++) {
cin >> b[i];
c[i] = a[i] - b[i];
}
sort(c, c + n);
for (int i = 0; i < n - 1; i++) {
int j = upper_bound(c + i + 1, c + n, -c[i]) - c;
//由于ans为long long而后面的数为int,因此需要对后面一个数乘一个1ll进行类型转换,否则会有警告。不使用1i64,CF貌似不接受。
ans += 1ll * n - j;
}
cout << ans;
}