题目链接:https://www.lanqiao.cn/problems/172/learning/
解题思路:本题比较简单,首先对数组排序,因为乱序会大大提高复杂度。通过for循环控制中间数组,创建两个指针,分别控制A数组和C数组。
代码如下:
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入
int N = sc.nextInt();
int[] A = new int[N];
int[] B = new int[N];
int[] C = new int[N];
for (int i = 0;i<N;i++){
A[i] = sc.nextInt();
}
for (int i = 0;i<N;i++){
B[i] = sc.nextInt();
}
for (int i = 0;i<N;i++){
C[i] = sc.nextInt();
}
//排序
Arrays.sort(A);
Arrays.sort(B);
Arrays.sort(C);
BigInteger result = BigInteger.valueOf(0);//防止溢出
int a = 0;//控制A数组的索引
int c = 0;//控制C数组的索引
for (int i = 0;i<N;i++){//i控制B数组的索引
while (a < N && A[a] < B[i] )a++;//每次遍历B数组时,比较A数组对应位置大小
while (c < N && B[i] >= C[c] )c++;//每次遍历B数组时,比较C数组对应位置大小
BigInteger every_result = BigInteger.valueOf(a).multiply(BigInteger.valueOf(N-c));
//N减去c的个数就是C数组比B数组大的个数
result = result.add(every_result);
}
System.out.println(result);
}
}