题意不说了
思路:以B数组为基准 寻找在A中第一个大于等于B元素的坐标 和 C中第一个大于B元素的坐标 相乘后加上即可。
这里用了二分 也可以用线性查找
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define sd(a) scanf("%d",&a)
#define sdd(a,b) scanf("%d%d",&a,&b)
#define cl(a,b) memset(a,b,sizeof(a))
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define sddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define dbg() printf("aaa\n")
using namespace std;
const int maxn=1e5+10;
int n;
int a[maxn],b[maxn],c[maxn];
int main() {
sd(n);
rep(i,1,n) sd(a[i]);
rep(i,1,n) sd(b[i]);
rep(i,1,n) sd(c[i]);
sort(a+1,a+n+1);
sort(b+1,b+n+1);
sort(c+1,c+n+1);
a[0]=c[0]=0;
a[n+1]=c[n+1]=inf;
ll ans=0;
rep(i,1,n){
int pa,pc;
if(b[i]>a[n]) pa=n+1;
else pa=lower_bound(a+1,a+n+1+1,b[i])-a;
pc=upper_bound(c+1,c+n+1,b[i])-c;
//printf("%d %d\n",pa,pc);
ans+=((pa-1)*(n-(pc-1)));
}
printf("%lld\n",ans);
return 0;
}
/*
3
1 2 4
2 3 4
3 4 5
3 4 2 9
*/