[UOJ299][CTSC2017] 游戏

【CTSC2017】游戏

problem

UOJ299

solution

定义 Xi:X_i:Xi: 当前已知条件第 iii 局的状态 1/01/01/0(胜/败)。

Xi=CiX_i=C_iXi=Ci 记为事件 AiA_iAi

假设现在已知条件共有 sss 个,即:第 k1∼sk_{1\sim s}k1s 局的胜负状态。

期望不妨拆成求和每一局获胜的概率。

那么答案为 ∑i=1nP(Xi=1∣Ak1Ak2...Aks)\sum_{i=1}^nP(X_i=1\Big|A_{k_1}A_{k_2}...A_{ks})i=1nP(Xi=1Ak1Ak2...Aks)

P(Xi=1∣Ak1Ak2...Aks)=P(Xi=1⋅Ak1...Aks)P(Ak1...Aks)P(X_i=1\Big|A_{k_1}A_{k_2}...A_{ks})=\frac{P(X_i=1·A_{k_1}...A_{k_s})}{P(A_{k_1}...A_{k_s})}P(Xi=1Ak1Ak2...Aks)=P(Ak1...Aks)P(Xi=1Ak1...Aks)

P(Ak1...Aks)=P(Ak1)P(Ak2∣Ak1)P(Ak3∣Ak1Ak2)...P(Aks∣Ak1...Aks−1)P(A_{k_1}...A_{k_s})=P(A_{k_1})P(A_{k_2}|A_{k_1})P(A_{k_3}|A_{k_1}A_{k_2})...P(A_{k_s}|A_{k_1}...A_{k_{s-1}})P(Ak1...Aks)=P(Ak1)P(Ak2Ak1)P(Ak3Ak1Ak2)...P(AksAk1...Aks1)

因为每一局的胜负概率只和上一局有关,所以 P(Ak3∣Ak1Ak2)=P(Ak3∣Ak2)P(A_{k_3}|A_{k_1}A_{k_2})=P(A_{k_3}|A_{k_2})P(Ak3Ak1Ak2)=P(Ak3Ak2)

即,P(Ak1...Aks)=P(Ak1)P(Ak2∣Ak1)P(Ak3∣Ak2)...P(Aks∣Aks−1)P(A_{k_1}...A_{k_s})=P(A_{k_1})P(A_{k_2}|A_{k_1})P(A_{k_3}|A_{k_2})...P(A_{k_s}|A_{k_{s-1}})P(Ak1...Aks)=P(Ak1)P(Ak2Ak1)P(Ak3Ak2)...P(AksAks1)

假设 k1<k2<...<kj<i<kj+1<...<ksk_1<k_2<...<k_j<i<k_{j+1}<...<k_sk1<k2<...<kj<i<kj+1<...<ks

类似地,P(Xi=1Ak1...Aks)=P(Ak1)...P(Akj∣Xi=1)P(Xi=1∣Akj+1)...P(Aks∣Aks−1)P(X_i=1A_{k_1}...A_{k_s})=P(A_{k_1})...P(A_{k_j}|X_i=1)P(X_i=1|A_{k_{j+1}})...P(A_{k_s}|A_{k_{s-1}})P(Xi=1Ak1...Aks)=P(Ak1)...P(AkjXi=1)P(Xi=1Akj+1)...P(AksAks1)

所以 P(Xi=1∣Ak1Ak2...Aks)=P(Akj∣Xi=1)P(Xi=1∣Akj+1)P(Akj+1∣Akj)P(X_i=1\Big|A_{k_1}A_{k_2}...A_{ks})=\frac{P(A_{k_j}|X_i=1)P(X_i=1|A_{k_{j+1}})}{P(A_{k_{j+1}}|A_{k_j})}P(Xi=1Ak1Ak2...Aks)=P(Akj+1Akj)P(AkjXi=1)P(Xi=1Akj+1)

答案为 ∑i=1nP(Akj∣Xi=1)P(Xi=1∣Akj+1)P(Akj+1∣Akj)\sum_{i=1}^n\frac{P(A_{k_j}|X_i=1)P(X_i=1|A_{k_{j+1}})}{P(A_{k_{j+1}}|A_{k_j})}i=1nP(Akj+1Akj)P(AkjXi=1)P(Xi=1Akj+1)

也就是说,已知结果将 nnn 局游戏划分成了若干段区间,每段的贡献计算的先决条件都是一样的。

也就是说每个区间的答案为 ∑i=kj+1i=kj+1−1P(Akj∣Xi=1)P(Xi=1∣Akj+1)P(Akj+1∣Akj)\sum_{i=k_j+1}^{i=k_{j+1}-1}\frac{P(A_{k_j}|X_i=1)P(X_i=1|A_{k_{j+1}})}{P(A_{k_{j+1}}|A_{k_j})}i=kj+1i=kj+11P(Akj+1Akj)P(AkjXi=1)P(Xi=1Akj+1)

Q(r∣l):Q(r|l):Q(rl):lllRRR 赢的情况下,第 rrrRRR 赢的概率,∼l\sim ll 则表示第 lllRRR 输。

显然有,Q(l+1∣l)=p[l+1]Q(l+1\Big|l)=p[l+1]Q(l+1l)=p[l+1],再考虑计算 Q(l+2∣l)Q(l+2\Big|l)Q(l+2l)
Q(l+2∣l)=Q(l+2∣l+1)⋅Q(l+1∣l)+Q(l+2∣∼(l+1))⋅Q(∼(l+1)∣l)=p[l+2]⋅p[l+1]+q[l+2]⋅(1−p[l+1])Q(l+2\Big|l)=Q(l+2\Big|l+1)·Q(l+1\Big|l)+Q(l+2\Big|\sim(l+1))·Q(\sim(l+1)\Big|l)\\=p[l+2]·p[l+1]+q[l+2]·(1-p[l+1]) Q(l+2l)=Q(l+2l+1)Q(l+1l)+Q(l+2(l+1))Q((l+1)l)=p[l+2]p[l+1]+q[l+2](1p[l+1])
同理可计算出,Q(l+2∣∼l),Q(∼(l+2)∣l),Q(∼(l+2)∣∼l)Q(l+2\Big|\sim l),Q(\sim (l+2)\Big|l),Q(\sim (l+2)\Big|\sim l)Q(l+2l),Q((l+2)l),Q((l+2)l)

发现,这其实是两个矩阵相乘的结果,即 fl+1⋅fl+2f_{l+1}·f_{l+2}fl+1fl+2

fi=[1−qiqi1−pipi]f_{i}=\begin{bmatrix}1-q_i\quad\quad q_i\\1-p_i\quad\quad p_i\end{bmatrix}fi=[1qiqi1pipi]

可以继续这么归纳下去,计算 Q(r∣l)Q(r\Big|l)Q(rl) 等相关信息,无非就是一个连续区间的矩阵相乘后某个位置的结果。

∑i=kj+1i=kj+1−1P(Akj∣Xi=1)P(Xi=1∣Akj+1)P(Akj+1∣Akj)\sum_{i=k_j+1}^{i=k_{j+1}-1}\frac{P(A_{k_j}|X_i=1)P(X_i=1|A_{k_{j+1}})}{P(A_{k_{j+1}}|A_{k_j})}i=kj+1i=kj+11P(Akj+1Akj)P(AkjXi=1)P(Xi=1Akj+1),用线段树维护矩阵 fff

分母就是 fff 矩阵从 kjk_{j}kj 一直乘到 kj+1k_{j+1}kj+1

分子就是 fff 矩阵乘到 iii 位置时,只乘第二列(表示胜利),可以新定义一个矩阵 gig_igi

gi=[0qi0pi]g_{i}=\begin{bmatrix}0\quad\quad q_i\\0\quad\quad p_i\end{bmatrix}gi=[0qi0pi],在乘到 iii 位置时变成乘 gig_igi

同样用线段树维护,gnow=flson∗grson+glson∗frson;fnow=flson∗grsong_{now}=f_{lson}*g_{rson}+g_{lson}*f_{rson};f_{now}=f_{lson}*g_{rson}gnow=flsongrson+glsonfrson;fnow=flsongrson

最后就是具体实现问题了。

考虑插入两个哨兵 0,n+10,n+10,n+1,初始局面答案就是一整个区间。

有涉及到询问当前已知条件中的前驱 lll 后继 rrr 问题,就需要用 STL 实现。

加点就用答案减去区间 (l,r)(l,r)(l,r) 的贡献,再加上区间 (l,i)(l,i)(l,i) 和区间 (i,r)(i,r)(i,r) 的贡献。

删点就用答案减去区间 (l,i)(l,i)(l,i) 和区间 (i,r)(i,r)(i,r) 的贡献,再加上区间 (l,r)(l,r)(l,r) 的贡献。

code

#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct matrix {double c[2][2];// double * operator [] ( int x ) { return c[x]; }matrix() { memset( c, 0, sizeof( c ) ); }friend matrix operator + ( matrix u, matrix v ) {matrix ans;for( int i = 0;i < 2;i ++ )for( int j = 0;j < 2;j ++ )ans.c[i][j] = v.c[i][j] + u.c[i][j];return ans;}friend matrix operator * ( matrix u, matrix v ) {matrix ans;for( int i = 0;i < 2;i ++ )for( int j = 0;j < 2;j ++ )for( int k = 0;k < 2;k ++ )ans.c[i][j] += u.c[i][k] * v.c[k][j];return ans;}void print() {for( int i = 0; i < 2; i ++ ) {for( int j = 0; j < 2; j ++ )printf( "%.3f ", c[i][j] );printf( "\n" );}}
};
#define maxn 200005
struct node { matrix f, g; }t[maxn << 2];
int n, m;
char type;
double ans;
double p[maxn], q[maxn];
map < int, bool > x;#define lson now << 1
#define rson now << 1 | 1
#define mid ( ( l + r ) >> 1 )node operator + ( node x, node y ) {node ans;ans.f = x.f * y.f;ans.g = x.g * y.f + x.f * y.g;return ans;
}void build( int now, int l, int r ) {if( l == r ) {t[now].f.c[0][0] = 1 - q[l];t[now].f.c[0][1] = t[now].g.c[0][1] = q[l];t[now].f.c[1][0] = 1 - p[l];t[now].f.c[1][1] = t[now].g.c[1][1] = p[l];// printf( "(%d):\n", l );// t[now].f.print();t[now].g.print();return;}build( lson, l, mid );build( rson, mid + 1, r );t[now] = t[lson] + t[rson];// printf( "{ %d } [%d, %d] ::\n", now, l, r );// t[now].f.print(); t[now].g.print();
}node query( int now, int l, int r, int L, int R ) {if( L <= l and r <= R ) return t[now];if( R <= mid ) return query( lson, l, mid, L, R );else if( mid < L ) return query( rson, mid + 1, r, L, R );else return query( lson, l, mid, L, R ) + query( rson, mid + 1, r, L, R );
}double Ask( int l, int r ) {node now = query( 1, 0, n + 1, l + 1, r );// now.f.print(); now.g.print();return now.g.c[x[l]][x[r]] / now.f.c[x[l]][x[r]];
}int main() {scanf( "%d %d %c %lf", &n, &m, &type, &p[1] );for( int i = 2;i <= n;i ++ ) scanf( "%lf %lf", &p[i], &q[i] );p[0] = q[0] = x[0] = 1, x[n + 1] = 0;build( 1, 0, n + 1 );ans = Ask( 0, n + 1 );// printf( "%f\n", ans );while( m -- ) {char opt[10]; int i, c;scanf( "%s", opt );if( opt[0] == 'a' ) {scanf( "%d %d", &i, &c );auto r = x.lower_bound( i );auto l = r;l --;x[i] = c;ans -= Ask( l -> first, r -> first );ans += Ask( l -> first, i );ans += Ask( i, r -> first );}else {scanf( "%d", &i );auto r = x.upper_bound( i );auto l = r;l --, l --;ans -= Ask( l -> first, i );ans -= Ask( i, r -> first );ans += Ask( l -> first, r -> first );x.erase( ++ l );}printf( "%f\n", ans );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Alice and Bob

Alice and Bob 题意&#xff1a; 两人博弈&#xff0c;每次一个人从一堆中拿k个&#xff0c;同时从另一堆拿k * s(s>0)个&#xff0c;问谁先不能拿 10000组数据,N<5000 题解&#xff1a; (x,y)表示第一堆石头数量为x&#xff0c;第二堆为y 如果(x,y)是必败状态&#…

一键发布部署vs插件[AntDeploy]开源了

deploy to remote server by one button click功能支持docker一键部署(支持netcore)支持iis一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚)(支持点火)支持windows服务一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚) 使用插件前我要发布一个net…

CF1257F Make Them Similar(meet in the middle,模拟退火)

前言 sto 退火大师_slb orz sto 正解大师_KHIN orz 只有我啥也不会&#xff0c;哈哈。 有趣的是&#xff0c;两种方法我都想到了一部分&#xff0c;然后都寄掉了。 这有趣个锤子。 解析 Sol1 考虑枚举最终的popcount&#xff0c;然后限制就变成了一个类似于高斯消元的形式…

Find 3-friendly Integers

Find 3-friendly Integers 题意&#xff1a; 定义一个自然数是精妙的&#xff0c;如果他存在一个字串(允许前导0)是3的倍数 问L到R中精妙的数的个数 题解&#xff1a; 数位dp可以做(但我不会。。。) 用结论来做&#xff0c;当n>100时(即为3位数时)必然是精妙的数&#x…

【学习笔记】平等博弈及常见的公平博弈类型

文章目录平等博弈nim堆SG定理nim和常见的公平博弈模型bash博弈nim博弈nim-k博弈wythoff博弈扩展wythoff博弈fibonacci博弈阶梯博弈green hackenbushMisre Nim博弈Every-SGnim积翻棋子游戏游戏的积&#xff0c;tartan定理平等博弈 G{L∣R},LRG\{L|R\},LRG{L∣R},LR&#xff0c;所…

Excel催化剂开源第31波-pdf相关功能实现及类库介绍

在Excel催化剂刚推出的pdf相关功能中&#xff0c;反馈很热烈&#xff0c;不止是用户层面好多人喜欢&#xff0c;也听到在.NET开发群里有询问pdf在winform上展现的功能诉求&#xff0c;一段时间没写开源篇&#xff0c;生怕大家以为Excel催化剂太小气了&#xff0c;不再开发了&am…

CF1526D Kill Anton(暴力)

前言 我的证明&#xff1a;这似乎非常对啊。 。。。 解析 直观感受&#xff1a;字母交错出现非常愚蠢。 然后就猜对了 为什么&#xff1f; 考虑两个相同但不相邻的字符 Ti,TjT_i,T_jTi​,Tj​&#xff0c;对应位置为 pi,pjp_i,p_jpi​,pj​。 夹在中间的字符 kkk 无非三种可…

Minimum spanning tree HDU - 6954

Minimum spanning tree HDU - 6954 题意&#xff1a; 给定n-1个点&#xff0c;编号从2到n&#xff0c;两点a和b之间的边权重为lcm&#xff08;a&#xff0c;b&#xff09;。请找出它们形成的最小生成树。 2<n<10000000 题解&#xff1a; 这题一看就眼熟。。。这不是去…

[小技巧]ASP.NET Core中如何预压缩静态文件

原文地址&#xff1a;Pre-compressed static files with ASP.NET Core作者&#xff1a;Gunnar Peipman译者&#xff1a;Lamond Lu译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10552131.html示例代码&#xff1a;https://github.com/lamondlu/CompressedStaticFileSample…

CF1494F Delete The Edges(欧拉回路)

前言 走远了走远了… 一直在想翻转一条链的奇偶性怎么做&#xff0c;但没有意识到最后一定是个菊花。 解析 一状态就是走一个欧拉回路&#xff0c;合法性更容易刻画&#xff0c;所以考虑反过来想&#xff0c;如何用状态二的走法删去一些边&#xff0c;使得剩下的图存在欧拉路…

【学习笔记】简单的连通性状压DP——插头DP(不学以为是天书)

文章目录哈希链表插头DP概念括号表示法 / 最小表示法例题洛谷插头dp板题CITYParkIITonys TourEfficient Tree[CQOI2015]标识设计哈希链表 众所周知&#xff0c;哈希是有冲突的可能性的&#xff0c;而且在状态数越多&#xff0c;冲突的概率就越高。目前掌握的处理方案有多哈希&…

H - Maximal submatrix HDU - 6957

H - Maximal submatrix HDU - 6957 题意&#xff1a; 给定一个n行m列的矩阵&#xff0c;求每列上面积不减的最大子矩阵 对于每个测试用例&#xff0c;打印一个表示最大子矩阵的整数 题解&#xff1a; 要求求一个最大面积的满足每列非递减的矩阵&#xff0c;这怎么想&#…

[NewLife.XCode]实体类详解

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

CF662C Binary Table(FWT_XOR卷积)

problem 洛谷链接 solution 第二次做的时候发现自己还是不会。发现自己没有写过题解&#xff0c;看来当时是没有完全搞懂的。 nnn 与 mmm 的量级相差很大&#xff0c;nnn 的范围是完全可以状压的。 不妨考虑枚举最后翻转了哪些行&#xff0c;将操作状压为一个数 XXX。 显然…

AT5662 [AGC040D] Balance Beam(二分)

前言 人类智慧&#xff0c;不可思议。 解析 考虑画出两个人的 S−TS-TS−T 折线图&#xff0c;那么答案如何表示&#xff1f; 可以理解成把 BBB 的图像不断下移&#xff0c;直到与 AAA 的图像只剩一个交点&#xff0c;此时在 xxx 轴的截矩就是答案。 设平移后 BBB 图像与 x…

Counting Triangles

Counting Triangles 题意&#xff1a; 给你一个完全图&#xff0c;每个边被赋值为0或1&#xff0c;问这个完全图中有多少个完美三角形&#xff1f; 完美三角形定义&#xff1a;三角形的三边都为0或1 题解&#xff1a; 正着求不好求&#xff0c;我们可以倒着想 不考虑完美&a…

程序员过关斩将--论商品促销代码的优雅性

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;YY说你帮她解决了几个问题&#xff0c;也帮我解决一个呗原来是D妹子&#xff0c;来坐我身边&#xff0c;说下情况我的项目是个电商项目&#xff0c;现在产品狗要给商品做活动正常呀我一个新手初来咋到顶不住压力了&…

[WC2018]州区划分(FWT_OR卷积)

problem 洛谷链接 solution 显然题目指向&#xff1a;存在欧拉回路的州划分是不合法的。 当且仅当这个州是 联通 的且 内部没有奇数度数的点 时&#xff0c;这个州不合法。 因为 nnn 非常小&#xff0c;我们可以枚举每一种州划分方案&#xff0c;判断是否合法&#xff0c;…

P5469 [NOI2019] 机器人(拉格朗日插值、区间dp)

解析 打表可得&#xff0c;有效状态大概只有 O(m)O(nlog⁡n)O(m)O(n\log n)O(m)O(nlogn) 种。 枚举最靠右的最大值位置&#xff0c;不难得到 O(mV)O(mV)O(mV) 的做法。 期望得分 505050 分。 考虑如何做 l0,r109l0,r10^9l0,r109。&#xff0c;发现前缀和后所有的 dpi,i,xxdp_…

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…