第十一届山东省大学生程序设计竞赛 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 1∼n,每个点都有一个人站在整点上。有 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(概率期望,递推前缀和优化)的主要内容,如果未能解决你的问题,请参考以下文章