1、双指针做法
import java.util.Arrays;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
int n=scan.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]=scan.nextInt();
for(int i=0;i<n;i++)
b[i]=scan.nextInt();
for(int i=0;i<n;i++)
c[i]=scan.nextInt();
Arrays.sort(a);
Arrays.sort(b);
Arrays.sort(c);
int p1=0,p2=0;
long cnt=0;
for(int i=0;i<n;i++)
{
while(p1<n&&a[p1]<b[i]) p1++;
while(p2<n&&c[p2]<=b[i]) p2++;
cnt+=(long)p1*(n-p2);
}
System.out.println(cnt);
scan.close();
}
}
2、二分做法
import java.util.Arrays;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
int n=scan.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]=scan.nextInt();
for(int i=0;i<n;i++)
b[i]=scan.nextInt();
for(int i=0;i<n;i++)
c[i]=scan.nextInt();
Arrays.sort(a);
Arrays.sort(b);
Arrays.sort(c);
long res=0;
for(int i=0;i<n;i++)
{
int x=b[i];
int p1,p2;
//1、在a从左往右看找到第一个>=x的数的位置
int l=0,r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=x) r=mid;
else l=mid+1;
}
p1=l;
if(a[l]<x)//找不到,表示a中的所有数都<x
p1=n;
//2、在c从左往右看找到第一个>x的数的位置
l=0;
r=n-1;
while(l<r)
{
int mid=l+r>>1;
if(c[mid]>x) r=mid;
else l=mid+1;
}
p2=l;
if(c[p2]<=x) //在c中找不到>x的数
p2=n;
//System.out.println(p1+" "+p2);
res+=(long)p1*(n-p2);
}
System.out.println(res);
scan.close();
}
}