CF248E.Piglets Birthday-概率、DP

news/2024/5/17 15:35:15

link:https://codeforces.com/contest/248/problem/E

题意:有 \(n\) 个货架,第 \(i\) 个货架初始有 \(a_i\) 罐蜂蜜,有 \(q\) 次操作,每次操作从 \(u\) 货架上等概率地选出 \(k\) 罐蜂蜜,尝一口,再放到 \(v\) 货架上,然后询问期望有多少个货架,上面每罐蜂蜜都被尝过。

\(n,q\leq 10^5,a_i\leq 100,k\leq 5\).


看数据范围, \(k\leq 5\)…好像只看这个也不能想到什么,但首先要意识到这个应该是有用的。

吃蜂蜜当成打标记:\(i\) 货架有 \(a_i\) 个小球,初始标记都是 \(0\) ,每次等概率选 \(k\) 个,打上 \(1\) 的标记,放到 \(v\) 上。很明显,被放到 \(v\) 上的蜂蜜一定是打过标记的。
刚开始的时候我想的是对被打过标记的蜂蜜进行DP,\(f(i,j)\) 表示 \(i\) 货架上有 \(j\) 罐蜂蜜被打过标记(被尝过)的概率,一次转移是 \(O(k\times a_i)\) 的,但这样复杂度是不对的,比如把很多罐蜂蜜都放到一个货架上, \(a_i\) 会长到 1e5 的范围,然后再把这些蜂蜜转移到其他地方,复杂度就爆炸了。

所以DP的时候也应当注意到这样一个关系,打过标记的蜂蜜越来越多,没打过标记的越来越少,同时,对每个货架来说,没被打过标记的也是越来越少的。

因此应该让 \(f(i,j)\) 表示,\(i\) 货架有 \(j\) 罐蜂蜜打过标记的概率,答案是 \(\sum f(i,0)\),转移则只要考虑 \(u\)

\[\frac{\binom{j}{i}\times \binom{a-j}{k-i}}{\binom{a}{k}}\cdot f(v,j)\to f_{new}(v,j-i) \]

预处理组合数(第二维 \(\leq k\)\(O(\max a_i\times k)\) 暴力处理就好),\(O(\max a_i \times k)\) 地转移

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int N=1e5+5;
const int C=105;
const int MX=5e5+50;
int n,q,a[N],mx[N];
double f[N][C],g[C],binom[MX][6];
int main(){fastio;cin>>n;rep(i,1,n){cin>>a[i];mx[i]=a[i];f[i][a[i]]=1;}rep(i,0,MX-5){binom[i][0]=1;rep(j,1,min(i,5))binom[i][j]=binom[i-1][j]+binom[i-1][j-1];}double ans=0;rep(i,1,n)ans+=f[i][0];cin>>q;while(q--){int u,v,k;cin>>u>>v>>k;ans-=f[u][0];rep(i,0,mx[u]){g[i]=f[u][i];f[u][i]=0;}rep(j,0,mx[u])rep(x,0,k)f[u][j-x]+=binom[j][x]*binom[a[u]-j][k-x]/binom[a[u]][k]*g[j];a[u]-=k;a[v]+=k;ans+=f[u][0];cout<<fixed<<setprecision(12)<<ans<<endl;}return 0;
}

顺带一提-Vandermonde卷积

上面DP转移里出现了转移系数:枚举状态 \(f(v,j)\) 的所有转移,所有转移的概率之和必然是 \(1\),那么有:

\[\sum_{i}\binom{j}{i}\times \binom{a-j}{k-i}=\binom{a}{k} \]

这个就是Vandermonde卷积公式啦,用题目中的例子就可以很好地解释其组合含义:有 \(a\) 个小球,有 \(j\) 个是好的,\(a-j\) 个是坏的,从中无序地选出 \(k\) 个,共有 \(\binom{a}{k}\) 种选择方式,而从另一角度考虑:枚举选了 \(i\) 个好球和 \(k-i\) 个坏球,算出来的方案自然是一样的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

springboot整合knfi4j

1.pom文件添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2.配置knfi4j @Configuration @EnableSwagger2 @Enable…

github在开启双因素认证后无法push

github在开启了双因素认证后,无法push代码 解决办法 1.打开github,点击右上角头像,点击setting2.选择左边菜单最右下角的Developer Settings3.点击 Person access tokens,选择第二个,Tokens(classic)4.创建一个token,可以选择过期时间和权限,如果是个人使用,直接选择不过期,勾上…

mysql刷题题后感

刷题的时候会将一些题目收藏,也会收藏错题,做完了整合一下,会有一些补充知识点。函数篇(和长篇大论的查询有交集) Q1: 查询语句select stuff(lo ina,3, 1, ve ch)结果为?love love china china love china答:stuff,删除并加入字符,STUFF(原字符, 开始位置, 删除长度,…

软件设计师:UML

UML基本概念UML(Unified Modeling Language,统一建模语言) UML词汇表包含3种构造块:事物、关系、图 事物结构事物:静态部分,如类、接口、用例等 行为事物:动态部分,如交互、状态机、活动 分组事物:包Package 注释事物:注释关系 UML中有4种关系:依赖、关联、泛化、实现…

linux13-用户,用户组

linux13-用户,用户组需要root权限执行 group add 创建用户组 # 查看含有关键词catcats66的组, 不存在 getent group | catcats66# 添加用户组catcats66 sudo groupadd catcats66 # 查询到含有关键词catcats66的组 getent group | catcats66groupdel 删除用户组 # 删除用户组 gr…

【VMware vSAN】如何删除虚拟机存储策略中的vSAN默认存储策略。

登录vSphere Client,展开左上角设置-策略和配置文件-虚拟机存储策略,可以查看系统默认创建的虚拟机存储策略。这些存储策略由系统自动生成,其中有一部分存储策略仅用于vSAN数据存储,作为vSAN 默认存储策略以应用于,当在部署虚拟机时未进行自定义存储策略时所默认分配的策略…

探索软件设计的九大核心架构模式

在当今迅速发展的软件开发领域,设计出卓越的软件系统是每一位程序员的追求。软件架构扮演着至关重要的角色,决定了系统的可维护性、可扩展性和性能。本文将深入探讨九大核心架构模式,揭示它们在软件设计中的美妙之处,以及在实际应用中的最佳实践。 分层架构(Layered Archi…

XSS(Pikachu)

XSS(Pikachu靶场) 概述 Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型: 1.反射性XSS; 2.存储型XSS; 3.DOM型XSS; XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一…