为什么全都是 dp?!
查看原帖
为什么全都是 dp?!
409236
StayAlone9.29Hz楼主2023/4/15 15:13

发现如果问题改为选择三个,就变得很简单。

先对于原数组排序。

记 fif_i 表示以 aia_i 结尾的选择三个数的方案。只需要差分 + 二分 + 前缀和就可以算出来。

令 posipos_i 表示 [i+1,n][i + 1, n] 内最小的满足 aj≥2aia_j\geq 2a_i 的 jj,那么答案就是 ∑cnti×(n−posi+1)\sum cnt_i\times (n - pos_i + 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;
}
2023/4/15 15:13
加载中...