思路:排序,对b利用二分用一个数组存下b中每个元素对应的c中大于该元素的个数,处理前缀和,枚举a的元素,二分找到第一个大于ai的b中的下标j,显然有bj~bn都会大于ai,对此时的ai满足的三元组个数显然是bj–bn中个数前缀和
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll a[N],b[N],c[N],num[N];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
for(int i=0;i<n;i++)cin>>c[i];
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
ll cnt=0;
for(int i=0;i<n;i++){
int pos=upper_bound(c,c+n,b[i])-c;
if(c[pos]==b[i])pos++;
if(pos>n)pos=n;
num[i+1]=n-pos;
}
for(int i=1;i<=n;i++)num[i]+=num[i-1];
for(int i=0;i<n;i++){
int pos=upper_bound(b,b+n,a[i])-b;
if(b[pos]==a[i])pos++;
cnt+=(num[n]-num[pos])*1ll;
}
cout<<cnt<<endl;
return 0;
}