题目描述
给定三个整数数组 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。
输出格式
一个整数表示答案。
输入输出样例
输入 #1复制
3 1 1 1 2 2 2 3 3 3
输出 #1复制
27
说明/提示
对于 30% 的数据,1≤N≤100。
对于 60% 的数据,1≤N≤1000。
对于 100% 的数据,1≤N≤105,0≤Ai,Bi,Ci≤105。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int A[N],B[N],C[N];
int cntA[N],cntC[N];
int main() {
int n;
cin>>n;
//遍历数组B 其实就是乘法计数原理 看这个位置A有多少个比他小 C有多少个比他大 然后依次相加
for(int i=1;i<=n;i++)
{
cin>>A[i];
}
for(int i=1;i<=n;i++)
{
cin>>B[i];
}
for(int i=1;i<=n;i++)
{
cin>>C[i];
}
sort(A+1,A+n+1);
sort(B+1,B+n+1);
sort(C+1,C+n+1);//排序
for(int i=1,j=1;i<=n;i++)
{
while(j<=n&&A[j]<B[i])
{
j++;
}
cntA[i]=j-1;//查找A的个数 注意要减一
}
for(int i=1,j=1;i<=n;i++)
{
while(j<=n&&C[j]<=B[i])
{
j++;
}
cntC[i]=n-j+1;//查找C的个数 其实跟A差不多 最后把等于的也算上减去就可以了
}
long long ans=0;
for(int i=1;i<=n;i++)
{
ans+=cntA[i]*cntC[i];
}
cout<<ans<<endl;
return 0;
}