递增三元组
题目描述
给定三个整数数组
A=[A1,A2,⋯AN]A=[A1,A2,⋯AN],
B=[B1,B2,⋯BN]B=[B1,B2,⋯BN],
C=[C1,C2,⋯CN]C=[C1,C2,⋯CN],
请你统计有多少个三元组 (i,j,k)(i,j,k) 满足:
-
1≤i,j,k≤N1≤i,j,k≤N;
-
Ai<Bj<CkAi<Bj<Ck。
输入描述
第一行包含一个整数 NN。
第二行包含 NN 个整数 A1,A2,⋯ANA1,A2,⋯AN。
第三行包含 NN 个整数 B1,B2,⋯BNB1,B2,⋯BN。
第四行包含 NN 个整数 C1,C2,⋯CNC1,C2,⋯CN。
其中,1≤N≤105,0≤Ai,Bi,Ci≤1051≤N≤105,0≤Ai,Bi,Ci≤105。
输出描述
输出一个整数表示答案。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],c[N],n;long long cnt=0;
int main()
{
cin>>n;
long long o=0,f=0;
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);
for(int i=0;i<n;i++)
{
while(o<n&&a[o]<b[i]){ o++;}
while(f<n&&c[f]<=b[i]){f++;}
cnt+=(o*(n-f));
}
cout<<cnt<<endl;
return 0;
}