题解-bzoj2554 Color
Problem
Please contact lydsy2012@163.com!
题意概要:有 \(n\) 个球排成一列,每个球都有一个颜色,每次随机选出两个球,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一样?
\(n\leq 10^4\)
Solution
推这题用了大半张草稿纸的说 最近用纸效率剧增啊
考虑只要找出对于每一种颜色\(C\),整个序列最终全部变为\(C\)的情况
设整个序列最终变为颜色 \(i\) 的概率为\(p_i\),期望步数为 \(g_i\),则答案可以表示为
\(Ans=\sum p_ig_i\)
(这里的变量与下文冲突时以下文为准,这里的变量只是作表达作用)
但是要注意,这里的期望步数是在“序列最终变为颜色\(i\)”前提下的期望,是一种条件期望
然后如果想让序列变为颜色 \(i\) ,则对于当前序列而言,只有“是颜色\(i\)”和“不是颜色\(i\)”这两种情况,所以可以将情况化简为一个\(01\)序列,且当前有\(i\)个\(1\),求所有元素变为\(1\)的概率和期望步数
先来解决概率问题
所有操作共有\(n(n-1)\)个,若当前有\(i\)个\(1\),则会改变\(1\)的数量的只有 \(2i(n-i)\)种操作,而且其中会使序列增加一个\(1\)的有其中的一半\(i(n-i)\)种,而使序列减少一个\(1\)的也有\(i(n-i)\)种。即每个回合有\(\frac {i(n-i)}{n(n-1)}\)的概率使\(i\)加一,有\(\frac {i(n-i)}{n(n-1)}\)的概率使\(i\)减一,还有\(1-\frac {2i(n-i)}{n(n-1)}\)的概率没有变化
设\(p_i\)表示当目前有\(i\)个\(1\)时,最终变为颜色\(i\)的概率
由于若已经没有\(1\),则再没有可能使整个序列变为\(1\)了,所以有\(p_0=0\),类似的,有\(p_n=1\)
由分析中\(i\)上升下降概率相同,可以列出\(p_i=\frac {p_{i-1}+p_{i+1}}2,i\in(0,n)\)
由于表達的是等差数列,所以可以轻松得到\(p_i=\frac in\)
再來解決期望问题
考虑到每次操作有一定几率不会对局面进行影响,影响成功的几率为\(\frac {2i(n-i)}{n(n-1)}\),根据期望问题的性质,则期望操作\(\frac {n(n-1)}{2i(n-i)}\)次会对局面影响一次
设\(f_i\)表示当前有\(i\)个\(1\)时序列变为颜色\(i\)的期望步数
则得到方程:\(f_i=\frac {n(n-1)}{2i(n-i)}+\frac 12f_{i-1}+\frac 12f_{i+1}\)
但是这样就错了
因为当前要算的是条件期望,而当局面内有\(i-1\)个\(1\)和有\(i+1\)个\(1\)时整个序列全变\(1\)的概率不一样,由于期望计算是概率乘以权值,所以两者的比例不能简单计算为\(1:1\)
相应的,由之前计算的概率可以得到,若当前局面有\(i-1\)个\(1\),则整个序列全变\(1\)的概率为\(\frac {i-1}n\),相应的,有\(i+1\)个\(1\)时概率为\(\frac {i+1}n\),又由于当前状态只有这两种后继状况,所以两个概率应除以两个概率的和
所以上面的方程需要变化为:
\(f_i=\frac {n(n-1)}{2i(n-i)}+\frac {i-1}{2i}f_{i-1}+\frac {i+1}{2i}f_{i+1}\)
然后利用之前学习的线性高斯消元就可以套路解决了
(这里还是写一下吧,别到时候看这题的时候又推一整版草稿纸)
设\(f_i=k_if_{i+1}+b_i\)
考虑利用这个式子将上面方程进行消元,将这个式子中带入方程右边的第二项,得到
\]
\]
\]
和之前设置的状态\(f_i=k_if_{i+1}+b_i\)相比,可以得到
\begin{cases}
k_i = \frac {\frac {i+1}{2i}}{1-\frac {i-1}{2i}k_{i-1}} \\
b_i = \frac {\frac {i-1}{2i}b_{i-1}+\frac {n(n-1)}{2i(n-i)}}{1-\frac {i-1}{2i}k_{i-1}}
\end{cases}
\end{equation}
\]
然后由于\(f_0\)没有意义,就无需从此转移,所以得到特殊情况
\(f_1=\frac {n(n-1)}{2\times 1\cdot (n-1)}+f_2=\frac n2+f_2\)
又由于\(f_1=k_1f_2+b_1\),可以得到在\(i=1\)下的特殊情况:\(\begin {cases}k_1=1\\b_1=\frac n2\end{cases}\)
由第一项和上面得到的递推公式,可以推得所有的\(k_i,b_i\),又由于\(f_n=0\),可以轻易得到所有的\(f_i\)
最终统计答案
若一种颜色出现了\(c\)次,则这个颜色对答案的贡献为\(\frac cn\cdot f_c\)
Code
代码还是很短的
#include <cstdio>
const int N=10103;
double k[N],b[N],f[N];
char s[N];int n,ct[26];
int main(){
scanf("%s",s+1);
for(n=1;s[n];++n)
++ct[s[n]-'A'];
--n;k[1]=1,b[1]=0.5*n;
double iv,bs;
for(int i=2;i<n;++i){
iv=0.5/i;
bs=1.0/(1-(i-1)*iv*k[i-1]);
k[i]=(i+1) * iv * bs;
b[i]=((i-1) * iv * b[i-1] + n*(n-1)* iv / (n-i) ) * bs;
}
for(int i=n-1;i;--i)
f[i]=k[i]*f[i+1]+b[i];
double ans=0.0;
for(int i=0;i<26;++i)
ans+=1.0*ct[i]/n*f[ct[i]];
printf("%.1lf\n",ans);
return 0;
}
题解-bzoj2554 Color的更多相关文章
- bzoj2554: Color
Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一 ...
- BZOJ2554 color 【概率DP】【期望DP】
题目分析: 好题. 一开始看错题了,以为是随机选两个球,编号在前的染编号在后的. 但这样仍然能获得一些启发,不难想到可以确定一个颜色,剩下的颜色是什么就无关了. 那么答案就是每种颜色的概率乘以期望.概 ...
- 【BZOJ2554】Color 概率神题
[BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...
- PAT甲题题解-1054. The Dominant Color (20)-排序/map
原本用map,发现超时了,后来便先用数组存储排个序,最后for一遍统计每种颜色出现的次数(每种颜色的首位索引相减+1),找出最多的即可. #include <iostream> #incl ...
- HDU1556 Color the ball(差分数组)题解
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 洛谷 P1840 【Color the Axis_NOI导刊2011提高(05)】 题解
看了一下题解,显然在做无用功啊,而且麻烦了许多,但是这道题真心不难,显然是一个区间修改的题目,然后查询的题目 我的线段树只需要记录一个量:区间和 看了一下其他题解的pushdown函数,发现真心写的很 ...
- HDU 1556 Color the Ball 线段树 题解
本题使用线段树自然能够,由于区间的问题. 这里比較难想的就是: 1 最后更新须要查询全部叶子节点的值,故此须要使用O(nlgn)时间效率更新全部点. 2 截取区间不能有半点差错.否则答案错误. 这两点 ...
- 【贪心】Codeforces 349B.Color the Fence题解
题目链接:http://codeforces.com/problemset/problem/349/B 题目大意 小明要从9个数字(1,2,--,9)去除一些数字拼接成一个数字,是的这个数字最大. 但 ...
- HDU 1556 Color the ball 树状数组 题解
Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动 ...
随机推荐
- python 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)
1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...
- css3 实现波浪(wave)效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux 下安装ftp 并远程连接
1.确认是否已安装 ftp 1 pgrep vsftpd #查看ftp 服务进程 无结果如下图所示 2.执行安装 1 yum install vsftpd #安装ftp 服务 3.执行过程 ...
- 那些年我们没能bypass的xss filter[from wooyun]
原文链接:http://zone.wooyun.org/content/6899 小弟初学xss才10天.不过个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列 ...
- Python复习笔记(五)面向对象
1. __init__方法 # 1. 为对象在内存 中分配空间 -- 创建对象 # 2. 为对象属性 设置初始值 -- 初始化方法(init)+-------------- # 3. __init__ ...
- IO流----操作文件的9种方法代码实现
IO流----操作文件的9种方法代码实现: 1:使用字节流读写数据: 四种方式: method1: 每次读写一个字节,边读边写: /* * 复制文本文件. * * 数据源:从哪里来 ...
- 一些优秀的Python包
总结一下我使用到的一些比较优秀的Python package =========================通用包========================= Werkzeug itsdan ...
- 【四】Java虚拟机内存区域初识
一.线程独占区 1.程序计数器 程序计数器是一块处于线程独占区较小的内存空间,它可以看是当前线程所执行的字节码的行号指示器. 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码 ...
- XXE攻防
一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文档类型定义(可 ...
- 关于利用PHP访问MySql数据库的逻辑操作以及增删改查实例操作
PHP访问MySql数据库 <?php //造连接对象$db = new MySQLi("localhost","root","",& ...