[期望] CF1187F Expected Square Beauty
先添加一个 \(0\) ,取值为 \([0,0]\),则有
\[E(B(x)) = E(\sum\limits_{i=0}^{n-1}[x_i\neq x_{i+1}])
\]
\[\begin{aligned}E(B(x)^2) &= E(\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1}[x_i\neq x_{i+1}][x_j\neq x_{j+1}])\end{aligned}
\]
记 \(p_i = E([x_i\neq x_{i+1}])\),考虑所有的 \(i,j\) 的贡献:
-
\(|i-j|>1:\) \(i,j\) 互不影响,贡献为 \(p(i)p(j)\);
-
\(i=j:\) 贡献为 \(E([x_i\neq x_{i+1}][x_i\neq x_{i+1}]) = E([x_i\neq x_{i+1}]) = p_i\);
-
\(|i-j|=1:\) 只考虑 \(i=j-1\),贡献为
\[\begin{aligned}2\times E([x_{i}\neq x_{i+1}][x_{i+1}\neq x_{i+2}]) &= 2\times(1-E([x_{i}=x_{i+1}]) - E([x_{i+1}=x_{i+2}]) + E([x_i = x_{i+1} = x_{i+2}])) \\ &= 2\times (1-(1-p_i)-(1-p_{i+1})+ E([x_i = x_{i+1} = x_{i+2}]))\end{aligned}
\]
\(p_i\) 的计算可以考虑求补集,即 \(p_i = 1 - E([x_i=x_{i+1}])\);
\(E([x_i=x_{i+1}]) = \max (0, \min(b_i,b_{i+1}) - \max(a_i,a_i+1)+1)\),\(E([x_i = x_{i+1} = x_{i+2}])\) 同理可以计算。
时间复杂度 \(\mathrm{O(n\log n)}\) 。
\(\texttt{Code:}\)
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
using namespace std;
inline int read() {
int x = 0; char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
return x;
}const int cmd = 1e9 + 7;
int _add(int a, int b) {a += b; return a < cmd ? a : a - cmd;}
int _sub(int a, int b) {a -= b; return a < 0 ? a + cmd : a;}
int _mul(int a, int b) {return 1ll * a * b % cmd;}
int fpow(int a, int b) {
int res = 1;
for (; b; b >>= 1, a = _mul(a, a))
if (b & 1) res = _mul(res, a);
return res;
}
const int maxn = 2e5 + 5;
int n, a[maxn], b[maxn], p[maxn], sp[maxn], sf[maxn], ans;
int _get_its(int a, int b, int c, int d) {
return max(0, min(b, d) - max(a, c) + 1);
}
int main() {
n = read();
for (int i = 1; i <= n; i++) a[i] = read();
for (int i = 1; i <= n; i++) b[i] = read();
for (int i = 0; i < n; i++) {
int _its = _get_its(a[i], b[i], a[i + 1], b[i + 1]);
p[i] = _sub(1, _mul(_its, fpow(_mul(b[i] - a[i] + 1, b[i + 1] - a[i + 1] + 1), cmd - 2)));
ans = _add(ans, p[i]);
}sp[0] = p[0]; sf[n - 1] = p[n - 1];
for (int i = 1; i < n; i++) sp[i] = _add(sp[i - 1], p[i]);
for (int i = n - 2; ~i; i--) sf[i] = _add(sf[i + 1], p[i]);
for (int i = 2; i < n; i++) ans = _add(ans, _mul(sp[i - 2], p[i]));
for (int i = 0; i < n - 2; i++) ans = _add(ans, _mul(sf[i + 2], p[i]));
for (int i = 0; i < n - 1; i++) {
int m = max(0, min(b[i], min(b[i + 1], b[i + 2])) - max(a[i], max(a[i + 1], a[i + 2])) + 1);
m = _mul(m, fpow(_mul(b[i] - a[i] + 1, _mul(b[i + 1] - a[i + 1] + 1, b[i + 2] - a[i + 2] + 1)), cmd - 2));
ans = _add(ans, _mul(2, _add(1, _sub(m, _add(_sub(1, p[i]), _sub(1, p[i + 1]))))));
}printf("%d", ans);
return 0;
}

浙公网安备 33010602011771号