思路
对固定中间位置j,记y=aj。令频次函数为f(x),并定义
- G(t):数组中≥t的元素个数,
- L(t):数组中≤t的元素个数。
由条件max(ai−aj,aj−ak)=2aj可拆分为两种达到最大值的方式,并用容斥合并:
- 当ai−aj=2aj时,ai=3y且aj−ak≤2y⇒ak≥−y,贡献为f(3y)⋅G(−y);
题目内容
小红拿到一个长度为 n 的数组 {a1,a2,…,an} 。
她想要知道有多少个三元组 (i,j,k) 满足 max(ai−aj,aj−ak)=2×aj 。
请你帮她数一数。
输入描述
第一行输入一个整数 n(3≦n≦2×105) 代表数组长度。
第二行输入 n 个整数 a1,a2,...,an(−109≦ai≦109) ,表示数组中的元素。
输出描述
输出一个整数,表示满足条件的三元组个数。
样例1
输入
3
0 1 -1
输出
6
说明
在这个样例中,满足条件的三元组选取为
-
(i,j,k)=(1,1,1) ,此时左边 max {0−0,0−0} =0 ,右边 2×a1=0 ;
-
(i,j,k)=(1,1,2) ,此时左边 max {0−0,0−1} =0 ,右边 2×a1=0 ;
-
(i,j,k)=(1,2,3) ,此时左边 max {0−1,1−(−1)} =2 ,右边 2×a2=2 ;
-
(i,j,k)=(2,2,3) ,此时左边 max {1−1,1−(−1)} =2 ,右边 2×a2=2 ;
-
(i,j,k)=(3,1,1) ,此时左边 max {−1−0,0−0} =0 ,右边 2×a1=0 ;
-
(i,j,k)=(3,2,3) ,此时左边 max {−1−1,1−(−1)} =2 ,右边 2×a2=2 。
样例2
输入
4
0 0 -1 1
输出
20