题干:

给定一个长度为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,乘起来维护一个sum就好了。

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll cnt1,cnt3,sum3;
int a[100000 + 5];
int main()
{
	int n;
	ll sum = 0;
	cin>>n;
	for(int i = 1; i<=n; i++) {
		scanf("%d",&a[i]);
		if(a[i] == 3) sum3++;
	}
	for(int i = 1; i<=n; i++) {
		if(a[i] == 1) cnt1++;
		else if(a[i] == 3) cnt3++;
		else {
			sum += cnt1*(sum3-cnt3);
		}
	}
	printf("%lld\n",sum);
	return 0 ;
}

总结:

   注意这题别忘用longlong