给定三个整数数组 A=[A1,A2,⋯,AN],B=[B1,B2,⋯,BN],C=[C1,C2,⋯,CN]。
请你统计有多少个三元组 (i,j,k) 满足:
- 1≤i,j,k≤N
- Ai<Bj<Ck
输入格式
第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,⋯,AN。
第三行包含 N 个整数 B1,B2,⋯,BN。
第四行包含 N 个整数 C1,C2,⋯,CN。
输出格式
一个整数表示答案
输入输出样例
输入
3 1 1 1 2 2 2 3 3 3
输出
27
说明/提示
对于 30% 的数据,1≤N≤100。
对于 60% 的数据,1≤N≤1000。
对于 100% 的数据,1≤N≤105,0≤Ai,Bi,Ci≤105。
//代码使用二分搜索解决
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//三元组中元素个数
int N;
//创建三元组
vector<int> create(int n){
vector<int> source(n);
for(int i=0;i<n;i++){
cin>>source[i];
}
//排序好
sort(source.begin(),source.end());
return source;}
//二分算法
//查找数组中大于target的元素个数
int bigselect(vector<int> arr,int target){
int res=-1;
int left=0,right=arr.size()-1;
while(left<=right){
//计算
int mid=left + (right - left) / 2;
if(arr[mid]>target){
res=mid;
right=mid-1;
}else{
left=mid+1;
}
}
if(res==-1)return 0;
return arr.size()-res;
}
//查找数组中小于target的元素个数
int smallselect(vector<int> arr,int target){
int res=-1;
int left=0,right=arr.size()-1;
while(left<=right){
//计算中位数
int mid=left + (right - left) / 2;
if(arr[mid]<target){
res=mid;
left=mid+1;
}else{
right=mid-1;}}
if(res==-1)return 0;
return res+1;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>N;
//创建三元组
vector<int> numi=create(N);
vector<int> numj=create(N);
vector<int> numk=create(N);
int res=0;
for(int j=0;j<numj.size();j++){
int a=smallselect(numi,numj[j]);
int b=bigselect(numk,numj[j]);
res+=a*b;
}
cout<<res<<endl;
return 0;
}