发现如果问题改为选择三个,就变得很简单。
先对于原数组排序。
记 fi 表示以 ai 结尾的选择三个数的方案。只需要差分 + 二分 + 前缀和就可以算出来。
令 posi 表示 [i+1,n] 内最小的满足 aj≥2ai 的 j,那么答案就是 ∑cnti×(n−posi+1)。
int n, a[MAXN]; const int mod = 1e9 + 7;
ll ans, cnt[MAXN];
int main() {
read(n); rer(i, 1, n, a);
sort(a + 1, a + 1 + n);
rep1(i, 1, n) {
int l = a[i] / 2, r = a[i] * 2;
int pos1 = upper_bound(a + 1, a + i, l) - a - 1;
int pos2 = lower_bound(a + i + 1, a + n + 1, r) - a;
cnt[n + 1] -= pos1; cnt[pos2] += pos1;
}
rep1(i, 1, n) (cnt[i] += cnt[i - 1]) %= mod;
rep1(i, 1, n) {
int pos = lower_bound(a + i + 1, a + n + 1, a[i] * 2) - a;
(ans += cnt[i] * (n - pos + 1) % mod) %= mod;
} printf("%lld\n", ans);
rout;
}