给定一个长度为N的数组A=[A1, A2, ... AN],已知其中每个元素Ai的值都只可能是1, 2或者3。
请求出有多少下标三元组(i, j, k)满足1 ≤ i < j < k ≤ N且Ai < Aj < Ak。
Input
第一行包含一个整数N
第二行包含N个整数A1, A2, ... AN。(1 ≤ Ai ≤ 3)
对于30%的数据,1 ≤ N ≤ 100
对于80%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000
Output
一个整数表示答案
Sample Input
6 1 3 2 1 2 3
Sample Output
3
一开始想的是找到2然后计算2前边有几个1后边有几个3,果断超时
这个方法是先找出3的个数,然后在遍历的过程中可以动态的计算出当前2 前面1的个数,后边3的个数
import java.util.Scanner;
public class Main16 {
public static void main(String[] args) {
// Scanner scan=new Scanner(System.in);
// int n=scan.nextInt();
// int arr[]=new int[n];
// boolean[] bool=new boolean[n];
// for(int i=0;i<n;i++){
// arr[i]=scan.nextInt();
// if(arr[i]==2)
// bool[i]=true;
// else
// bool[i]=false;
// }
// long sum=0;
// for(int i=0;i<n;i++){
// if(bool[i]){
// int num1=0,num3=0;
// for(int j=0;j<i;j++){
// if(arr[j]==1){
// num1++;
// }
// }
// for(int j=i+1;j<n;j++){
// if(arr[j]==3){
// num3++;
// }
// }
// sum+=(long)num1*num3;
// }
// }
// System.out.println(sum);
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int arr[]=new int[n];
int num1=0,num3=0;
long sum=0;
for(int i=0;i<n;i++){
arr[i]=scan.nextInt();
if(arr[i]==3){
num3++;
}
}
for(int i=0;i<n;i++){
if(arr[i]==1){
num1++;
}
if(arr[i]==3){
num3--;
}
if(arr[i]==2){
sum+=(long)num1*num3;
}
}
System.out.println(sum);
}
}