[期望] CF1187F Expected Square Beauty

\(\texttt{link}\)

先添加一个 \(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;
}
posted @ 2022-02-14 10:55  klii  阅读(44)  评论(0)    收藏  举报