\(\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. windows宝塔面板请使用正确的入口登录面板问题解决记录

    问题起因:浏览器升级面板的时候,浏览器卡死,导致登录不进,cmd里面修复或者更新依然显示请使用正确的入口登录面板. 解决方法: 先停止宝塔面板,然后将下面这个目录删掉 C:\Program Files ...

  3. GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU

    本文主要分享在不同环境,例如裸机.Docker 和 Kubernetes 等环境中如何使用 GPU. 跳转阅读原文:GPU 环境搭建指南:如何在裸机.Docker.K8s 等环境中使用 GPU 1. ...

  4. 如何看待:以色列在真主党订购的5000台寻呼机中放了TNT

    日常生活等关键物品的生产必须要有国内完全掌握,美国.日本.以色列等国惯用的这种暗杀方法.如果不能在本国国内做到自主可控的产品生产,那么无疑是把自己的脑袋交给敌人来保护,随时都有丢命的可能. 同时,这也 ...

  5. 2.12 Linux两种远程管理工具(PuTTY和SecureCRT)

    通过<Linux远程管理协议>一节可以知道,Linux远程管理服务器多基于 SSH 协议.本节给大家介绍 2 种常见的基于 SSH 协议的远程管理工具,分别是 PuTTY 和 Secure ...

  6. Python基础快速入门

    1).Python运算符 1.Python算数运算符 描述: 例子: a = 21 b = 10 c = 0 c = a + b #31 c = a - b #11 c = a * b #210 c ...

  7. Pgloader极简教程

    目录 简介 安装 安装概述 CentOS编译安装 使用 命令行 配置文件迁移 可能遇到的错误 更多配置参考 总结 引用 简介 pgloader是一个数据同步工具,用来将数据从其它地方迁移到postgr ...

  8. An expression evaluator

    An expression evaluator  Download source code (17 kb) Two weeks ago, I saw an article on codeproject ...

  9. k8s之基础篇

    相关概念: kube-apierver: 控制平面组件,负责kubernetes api, 处理接受的请求工作 kube-controller-manager: 控制平面组件, 负责运行控制器进程 k ...

  10. 用谷歌经典ML方法方法来设计生成式人工智能语言模型

    上一篇:<人工智能模型学习到的知识是怎样的一种存在?> 序言:在接下来的几篇中,我们将学习如何利用 TensorFlow 来生成文本.需要注意的是,我们这里并不使用当前最热门的 Trans ...