给定一个长度为N的数组A=[A1, A2, ... AN],已知其中每个元素Ai的值都只可能是1, 2或者3。
请求出有多少下标三元组(i, j, k)满足1 ≤ i < j < k ≤ N且Ai < Aj < Ak。
第一行包含一个整数N
第二行包含N个整数A1, A2, ... AN。(1 ≤ Ai ≤ 3)
对于30%的数据,1 ≤ N ≤ 100
对于80%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000
一个整数表示答案
6 1 3 2 1 2 3
3
首先看一下题思路,如何找到三元组?先找到一个2,假设它的前边有n个1,后边有m个3,这该2能组成的三元组有n*m个;把所有2能组成的三元组加起来就是答案;
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
long long A[100005];
int main(){
int N;
cin >> N;
long long cnt_3, cnt_1;
cnt_3=cnt_1=0;
for(int i=0; i<N; i++){
cin >> A[i];
if(A[i]==3) cnt_3++; //计算3的个数;
}
long long ans=0;
for(int i=0; i<N; i++){
if(A[i]==1) cnt_1++; //1的个数;
if(A[i]==3) cnt_3--; //每遇到一个三,就减少3的个数,因为之后的1,2,无法与他
//构成递增序列;
if(A[i]==2) ans+=cnt_1*cnt_3;
}
cout << ans << endl;
return 0;
}