主要方法解释
首先,我们可以记一下在(A+1,A+N+1,B[i])-A中
返回的值1 <= x <= N+1;
当x=N+1时,表示B[i]比A数组当前范围所有数都大
low_bound求的是 大于等于 的目标的数的下标pos,也就是说
该下标pos减1就是B[i]连接A数组的方法数
upp_bound求的是 大于 的目标的数的下标pos,而我们需要的是C数组中pos->N的个数
也就是 N-pos+1;//特殊情况判断当pos=N+1时,仍然成立
C++ 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<set>
#include<unordered_map>
#include<cmath>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int N;
ll A[100010],B[100010],C[100010];
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++) scanf("%lld",&A[i]);
for(int i=1;i<=N;i++) scanf("%lld",&B[i]);
for(int i=1;i<=N;i++) scanf("%lld",&C[i]);
sort(A+1,A+N+1);
sort(B+1,B+N+1);
sort(C+1,C+N+1);
A[N+1]=B[N+1]=C[N+1]=1e9;
ll ans=0;
for(int i=1;i<=N;i++){
ll l=lower_bound(A+1,A+N+1,B[i])-A;
ll r=upper_bound(C+1,C+N+1,B[i])-C;
l--;
ans+=(l*(N-r+1));
}
printf("%lld",ans);
return 0;
}