题目解析
可以将问题转化为:“求满足 Ai<Aj<AkA_i \lt A_j \lt A_kAi <Aj <Ak 的三元组 (i,j,k)(i, j, k)(i,j,k) 的数量”。
> 对于满足题目原条件的三元组 (i,j,k)(i,j,k)(i,j,k),有且仅有一个 [Ai,Aj,Ak][A_i, A_j, A_k][Ai ,Aj ,Ak ] 的排列 PPP,使得 AP1<AP2<AP3A_{P_1} \lt A_{P_2} \lt A_{P_3}AP1 <AP2 <AP3 。
> 反之,对于有 Ai<Aj<AkA_i\lt A_j\lt A_kAi <Aj <Ak 的三元组 (i,j,k)(i,j,k)(i,j,k),有且仅有一个 [i,j,k][i,j,k][i,j,k] 的排列 PPP,使得 P1<P2<P3P_1 \lt P_2\lt P_3P1 <P2 <P3 。
考虑枚举 jjj,那么 iii 和 kkk 可以独立选择。
满足条件的 iii 的数量是 AAA 中数值小于 AjA_jAj 的元素个数;
满足条件的 kkk 的数量是 AAA 中数值大于 AjA_jAj 的元素个数。
因此,只要准备一个数组 cnt,令 cnt[x] 为 AAA 中小于等于 xxx 的数量,便可以很容易地计算出满足条件的 iii 和 kkk 的数量。
AC代码
C++ AC代码:
Python AC代码:
复杂度分析
统计所有数字出现的次数,使用前缀和处理 cnt 数组,最终枚举 jjj 统计答案,时间复杂度为 O(N+maxA)\mathrm{O}(N + \max{A})O(N+maxA)。