Codeforces 1187F Expected Square Beauty

Codeforces 1187F Expected Square Beauty

题目链接

https://codeforces.com/contest/1187/problem/F

题目大意

一个长度为 $n$ 的数列 $x$ ,每个位置上等概率出现 $L_i$ 到 $r_i$ 之间的数。设 $B(x)$ 为该数列的连续相同数字子段的个数,求 $E((B(x))^2)$。

题目分析

设 $f(i) = [x_i \neq x_{i – 1}]$ ,则有 $B(x) = \sum\limits_{i=1}^{n}f(i)$, 则有 $E((B(x))^2) = E((\sum\limits_{i=1}^{n}f(i))^2)$

将内层展开,则有 $E((B(x))^2) = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}{E(f(i)f(j))}$

考虑计算 $E(f(i)f(j))$ ,则会出现三种情况。

  1. $|i – j| > 1$,那么显然 $f(i)$ 于 $f(j)$ 之间互不影响,答案显然为 $E(f(i))E(f(j))$

  2. $i = j$ ,显然 $f(i)$ 和 $f(j)$ 要么同时发生,要么同时不发生,因此答案显然为 $E(f(i))$

  3. $|i – j| = 1$,那么显然他们之间会互相影响,那么需要求的是 $[x_i \neq x_{x – 1} \& x_j \neq x_{j – 1}]$。

显然 $1$ 和 $2$ 中的可以直接用 $1$ 减去 $x_i = x_{i – 1}$ 的概率求出,而 $3$ 中的使用容斥也同样很容易求出来。

最后将这些求和即可得到答案。

代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
int n;

long long L[maxn];
long long R[maxn];
long long p[maxn];

long long qpow(long long b, long long x){
	long long ret = 1;
	
	while(x){
		if(x & 1){
			ret = ret * b % mod;
		}
		x >>= 1;
		b = b * b % mod;
	}
	
	return ret;
}

int main(){
	int i, j;
	long long ans = 0;
	long long sum = 0;
	
	scanf("%d", &n);
	
	for(i=1;i<=n;i++){
		scanf("%lld", &L[i]);
	}
	
	for(i=1;i<=n;i++){
		scanf("%lld", &R[i]);
	}
	
	for(i=1;i<=n;i++){
		p[i] = (mod + 1 - max(0ll, min(R[i], R[i - 1]) - max(L[i], L[i - 1]) + 1) * qpow((R[i] - L[i] + 1) * (R[i - 1] - L[i - 1] + 1) % mod, mod - 2) % mod) % mod;
		ans = (ans - p[i] * p[i] + p[i]) % mod;
		ans = (ans + mod) % mod;
		sum += p[i];
	}
	
	sum %= mod;
	
	ans = (ans + sum * sum) % mod;
	
	for(i=2;i<=n;i++){
		ans = (ans - 2ll * p[i] * p[i - 1] % mod + mod) % mod;
		long long x = 1 - (1 - p[i]) - (1 - p[i - 1]) + max(0ll, min(min(R[i], R[i - 1]), R[i - 2]) - max(max(L[i], L[i - 1]), L[i - 2]) + 1)
					* qpow((R[i] - L[i] + 1) * (R[i - 1] - L[i - 1] + 1) % mod * (R[i - 2] - L[i - 2] + 1) % mod, mod - 2) % mod;
		ans += 2ll * x;
		ans %= mod;
	}
	
	printf("%lld\n", (ans + mod) % mod);
	
	return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据