1.从小到大
lower_bound(start,last,n) :返回第一个大于等于n的地址(-数组=》返回下标)
upper_bound(start,last,n) :返回第一个大于n的地址
2.从大到小
lower_bound(start,last,n,greater<int>()) :返回第一个小于等于n的地址
upper_bound(start,last,n,greater<int>()) :返回第一个小于n的地址
思路:
1. 数组a用来储存a[i]-b[i]的值
2.对a从小到大排序,利用upper_bound来找出第一个
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int b[N];
int main()
{
int n;
cin>>n;
long long sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
long long m;
cin>>m;
a[i]-=m;
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
long long p=0-a[i];
int m=upper_bound(a+i+1,a+n,p)-a; //找到该序列中第一个大于p的数的下标
sum+=n-m;
}
cout<<sum<<endl;
}