第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

Posted 繁凡さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)相关的知识,希望对你有一定的参考价值。

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)

Weblink

https://ac.nowcoder.com/acm/contest/15600/L

Problem

数轴上 1 ∼ n 1\\sim n 1n,每个点都有一个人站在整点上。有 m m m 个基站,每个基站 { x , p [ x ] } \\{x,p[x]\\} {x,p[x]},代表位置为 x x x ,每一个人连接该基站成功的概率为 p x p_x px

每个人,都会按照由近及远先左后右的顺序依次尝试连接基站,成功连接基站 i i i 的概率是 p i p_i pi ,如果都
失败了,那么重新再来一遍。

每个基站的开销是连接人数的平方。求所有基站期望运行总代价。

Solution

显然考虑几何概型。

在这里插入图片描述

Time

O ( n ) O(n) O(n)

Code

#include <bits/stdc++.h>

using namespace std;
#define int long long
const int N = 1e6 + 7, mod = 998244353;

int n, m;
int a[N];
int pre[N], pre2[N], suf[N], suf2[N];
int F, ans;
int p[N], now;

int qpow(int a, int b)
{
	int res = 1;
	while(b) {
		if(b & 1) res = res * a % mod;
		a = a * a % mod;
		b >>= 1;	
	}
	return res;
}

int inv(int x)
{
	return qpow(x, mod - 2);
}

signed main()
{
	F = 1;
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= m; ++ i) {
		int x, pi;
		scanf("%lld%lld", &x, &pi);
		p[x] = pi;
		F = F * (1 - pi + mod) % mod;
	}
	if(n == 1) {
		puts("1");
		return 0;
	}
	F = inv(1 - F + mod);
	pre[2] = (1 - p[1] + mod) % mod;
	pre2[2] = (1 - p[1] + mod) % mod * (1 - p[1] + mod) % mod;
	now = (1 - p[1] + mod) % mod;
	for(int i = 3; i <= n; ++ i) {
		int ansb = (1 - p[i - 1] + mod) % mod * (1 - p[i - 2] + mod) % mod;//先左再右,x在右边
		now = now * (1 - p[i - 1] + mod) % mod;
		int ansa = pre[i - 2];
		pre[i] = (ansb * ansa % mod + ansb + now) % mod;
		ansa = pre2[i - 2];
		pre2[i] = (ansb * ansb % mod * ansa % mod + ansb * ansb % mod + now * now % mod) % mod;
	}
	suf[n - 1] = (1 - p[n] + mod) % mod;
	suf2[n - 1] = (1 - p[n] + mod) % mod * (1 - p[n] + mod) % mod;
	now = (1 - p[n] + mod) % mod;
	for(int i = n - 2; i >= 1; -- i) {
		int ansb = (1 - p[i + 1] + mod) % mod * (1 - p[i + 2] + mod) % mod;
		int tmp = (1 - p[i + 1] + mod) % mod;//先左再右,x在左边
		now = now * (1 - p[i + 1] + mod) % mod;
		int ansa = suf[i + 2];
		suf[i] = (ansb * ansa % mod + tmp + now) % mod;
		ansa = suf2[i + 2];
		suf2[i] = (ansb * ansb % mod * ansa % mod + tmp * tmp % mod + now * now % mod) % mod;
	}
	for(int i = 1; i <= n; ++ i) {
		int A = (pre[i] + 1 + suf[i]) % mod * p[i] % mod * F % mod;
		int B = (pre2[i] + 1 + suf2[i]) % mod * p[i] % mod * p[i] % mod * F % mod * F % mod;
		ans = (ans + A * A % mod - B + A + mod) % mod;
	}
	printf("%lld\\n", ans);
	return 0;
}

以上是关于第十一届山东省大学生程序设计竞赛 L. Construction of 5G Base Stations(概率期望,递推前缀和优化)的主要内容,如果未能解决你的问题,请参考以下文章

第十一届山东省大学生程序设计竞赛(正式赛)

第十一届山东省大学生程序设计竞赛题解(9 / 13)

“山大地纬杯”第十二届山东省ICPC大学生程序设计竞赛 AHK

第十六届全国大学生智能车竞赛线上赛点赛道审核 - 山东赛区

第十六届全国大学生智能车竞赛山东赛区成绩汇总

参加第十六届全国大学生智能车竞赛广东省报名队伍