\(\mathscr{Description}\)

  有 \(n\) 个随机真值 \(x_{1..n}\), 已知 \(P(x_1=1)=p_1\), 对于 \(2\le i\le n\), \(P(x_i=1\mid x_{i-1}=1)=p_i\), \(P(x_i=1\mid x_{i-1}=0)=q_i\). 设事件集合 \(S\), 初始时 \(S=\varnothing\). 给出 \(m\) 次修改, 每次修改:

  1. 给定 \(i,c\), 令 \(S\gets S\cup\{x_i=c\}\).
  2. 给定 \(i\), 令 \(S\gets S\setminus\{x_i=\star\}\).

每次修改完成后, 求出 \(E\left(\sum_{i=1}^nx_i\mid S\right)\), 保留浮点.

\(\mathscr{Solution}\)

  令 \(\xi:\{x_{1..n}\}\mapsto\sum_{i=1}^nx_i\), 那么

\[\begin{aligned}
E(\xi\mid S) &= \sum_iiP(\xi=i\mid S)\\
&= \sum_iiP(\xi=i\land S)/P(S)\\
&=E([S]\times\xi)/P(S),
\end{aligned}
\]

其中当 \(S\) 内事件全部发生时 \([S]=1\), 否则 \([S]=0\).

  现在, 我们的任务变成了维护出 \(E([S]\times\xi)\) 和 \(P(S)\). 容易发现从 \(i-1\) 的信息推到 \(i\) 的信息是一个线性变换, 我们需要的东西大概有: \(P(x_i=1\land S)\), \(P(x_i=0\land S)\), \(E([S\land x_i=1]\times\xi_i)\) 和 \(E([S\land x_i=0]\times\xi_i)\), 其中 \(\xi_i:\{x_{1..i}\}\mapsto\sum_{j=1}^ix_j\), 然后按照规则变换一下:

\[\begin{bmatrix}
P(x_i=1\land S)\\
P(x_i=0\land S)\\
E([S\land x_i=1]\xi_i)\\
E([S\land x_i=0]\xi_i)
\end{bmatrix}
=
\begin{bmatrix}
\color{red}{p_i} & \color{red}{q_i}\\
\color{blue}{1-p_i} & \color{blue}{1-q_i}\\
\color{red}{p_i} & \color{red}{q_i} & \color{red}{p_i} & \color{red}{q_i}\\
& & \color{blue}{1-p_i} & \color{blue}{1-q_i} &
\end{bmatrix}
\begin{bmatrix}
P(x_{i-1}=1\land S)\\
P(x_{i-1}=0\land S)\\
E([S\land x_{i-1}=1]\xi_{i-1})\\
E([S\land x_{i-1}=0]\xi_{i-1})
\end{bmatrix}.
\]

中间的转移矩阵是 \(\{x_i=\star\}\notin S\) 的情况; 当 \(\{x_i=1/0\}\in S\) 时, 只需要对应保留矩阵中红色行和蓝色行即可, 其组合意义也比较简单.

  最后, 钦定 \(x_0=1\), 将 \(\begin{bmatrix}1 & 0 & 0 & 0\end{bmatrix}^T\) 输入线性变换, 就能得到最终答案. 线段树维护矩阵, 复杂度 \(4^3\times \mathcal O(n\log n)\). 常数好像 ... 有点大欸.

\(\mathscr{Code}\)

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) #define double long double const int MAXN = 2e5;
int n, m;
double p[MAXN + 5], q[MAXN + 5]; struct Matrix {
double mat[4][4];
// Matrix(): mat{} {}
inline double* operator [] (const int k) { return mat[k]; }
inline Matrix operator * (const Matrix& u) const {
Matrix ret; memset(ret.mat, 0, sizeof ret.mat);
rep (i, 0, 3) rep (k, 0, 3) rep (j, 0, 3) {
ret[i][j] += mat[i][k] * u.mat[k][j];
}
return ret;
}
}; #define unknown(i) Matrix{{ \
{ p[i], q[i] }, \
{ 1 - p[i], 1 - q[i] }, \
{ p[i], q[i], p[i], q[i] }, \
{ 0, 0, 1 - p[i], 1 - q[i] } \
}} #define winR(i) Matrix{{ \
{ p[i], q[i] }, \
{}, \
{ p[i], q[i], p[i], q[i] }, \
{} \
}} #define winB(i) Matrix{{ \
{}, \
{ 1 - p[i], 1 - q[i] }, \
{}, \
{ 0, 0, 1 - p[i], 1 - q[i] } \
}} struct SegmentTree {
Matrix uni[MAXN << 2]; inline void pushup(const int u) {
uni[u] = uni[u << 1 | 1] * uni[u << 1];
} inline void build(const int u, const int l, const int r) {
if (l == r) return void(uni[u] = unknown(l));
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
} inline void modify(const int u, const int l, const int r,
const int x, const Matrix k) {
if (l == r) return void(uni[u] = k);
int mid = l + r >> 1;
if (x <= mid) modify(u << 1, l, mid, x, k);
else modify(u << 1 | 1, mid + 1, r, x, k);
pushup(u);
}
} sgt; int main() {
scanf("%d %d %*s %Lf", &n, &m, &p[1]);
rep (i, 2, n) scanf("%Lf %Lf", &p[i], &q[i]); sgt.build(1, 1, n); while (m--) {
char op[10]; int i, c;
scanf("%s", op);
if (op[0] == 'a') {
scanf("%d %d", &i, &c);
sgt.modify(1, 1, n, i, c ? winR(i) : winB(i));
} else {
scanf("%d", &i);
sgt.modify(1, 1, n, i, unknown(i));
}
auto& ans = sgt.uni[1];
printf("%.12Lf\n", (ans[2][0] + ans[3][0]) / (ans[0][0] + ans[1][0]));
}
return 0;
}

Solution -「CTSC 2017」「洛谷 P3772」游戏的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  3. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  4. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  5. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  6. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  7. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  8. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  9. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  10. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

随机推荐

  1. 洛谷 P1540 [NOIP2010 提高组] 机器翻译

    题目概括 给定 N 个整数,和一个容量为 M 的"字典",从头到尾依次翻译,每次翻译先看自家字典,没有的话再看别人的字典并存到自家字典,如果自家字典满了,当前单词的翻译会代替最早进 ...

  2. Uniswap V2 核心 合约代码

    Uniswap V2 核心 UniswapV2Factory UniswapV2Pair UniswapV2ERC20 IUniswapV2Router02 1. UniswapV2Factory 合 ...

  3. Java面试真题之中级进阶(线程,进程,序列化,IO流,NIO)

    前言 本来想着给自己放松一下,刷刷博客,慕然回首,线程.程序.进程?Java 序列化?Java 中 IO 流? Java IO与 NIO的区别(补充)?似乎有点模糊了,那就大概看一下Java基础面试题 ...

  4. IntelliJ IDEA 2024.1 安装激活 (亲测有效!)

    第一步:下载 IDEA 安装包 访问 IDEA 官网,下载 IDEA 2024.1.4 版本的安装包,下载链接如下 : idea官方链接 也可以在这里点击下载idea下载idea 第二步: 安装 ID ...

  5. 模拟器运行环境及Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏

    SuperMario_GeneticEvolution_Neat 项目介绍: 模拟器运行环境及Lua代码--使用遗传进化算法(neat算法)玩超级玛丽游戏 代码地址: https://openi.pc ...

  6. MongoDB面试专题33道解析

    大家好,我是 V 哥.今天给大家分享 MongoDB的道 V 哥整理的面试题,收藏起来,一定会对你有帮助. 1. 你说的 NoSQL 数据库是什么意思?NoSQL 与 RDBMS 直接有什么区别?为什 ...

  7. IIC通信协议详解 & PCF8591应用(Verilog实现)

    该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易懂.该文图片均从PCF8591手册中截取,一定程度上引导读者学习阅读data she ...

  8. WebUI自动化框架-playwright

    (持续更新) 一.环境准备 安装playwright:playwright是基于python3.7开发的第三方包,所以需要使用的python版本是3.7及其以上的 pip install playwr ...

  9. (Redis基础教程之七)如何使用Redis中的Hashes

    如何在ubuntu18.04上安装和保护redis 如何连接到Redis数据库 如何管理Redis数据库和Keys 如何在Redis中管理副本和客户端 如何在Redis中管理字符串 如何在Redis中 ...

  10. python之DataClass

    Python 在版本 3.7 (PEP 557) 中引入了dataclass.dataclass允许你用更少的代码和更多的开箱即用功能来定义类. 下面定义了一个具有两个实例属性 name 和 age ...