解题思路:
由于 n 的大小限制,两个for循环必然超时。
调整不等式 为 (Ai - Bi) + (Aj - Bj) > 0 ,那么此时就可将两个数组转换为一个数组
然后从小到大排序,利用二分,对于第i项,通过二分在[i+1,n]找到最小的j,满足该不等式,使用upper_bound函数即可
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N],b[N],c[N],d[N];
int main()
{
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i = 1; i <= n; i++) {
cin>>a[i];
}
for(int i = 1; i <= n; i++) {
cin>>b[i];
c[i] = a[i]-b[i];
}
sort(c+1,c+n+1);
long long ans=0;
for(int i=1;i<=n;i++){
int pos=upper_bound(c+i+1,c+n+1,-c[i])-c-1;
if(pos>=n+1)
continue;
ans += (n-pos);
}
cout<<ans<<endl;
return 0;
}