题目链接

题目大意:

有长度为\(n\)的区间,每次随机选择一段(左右端点都是整数)染黑,问期望多少次全部染黑。

\(n\leq 50\)

设\(n\)个随机变量\(t_1,...,t_n\)。\(t_i\)表示第一次覆盖到\(i\)的时间的期望。则我们要求的是\(\displaystyle\max_{i=1}^{n}(E(t_i))\)。

考虑minmax容斥:

\[\max_{x\in s}(E(x))=\sum_{t\subseteq s}(-1)^{|t|+1}\min_{x\in t}(E(x))
\]

这样我们就转化为对于每点集\(s\),求它第一次被覆盖到的期望操作次数(覆盖到其中任何一个点都算覆盖)。

如果我们知道了只操作一次的情况下它被覆盖概率\(p\),则期望操作次数就是\(\frac{1}{p}\)。(例如掷一次骰子掷到\(3\)的概率是\(\frac{1}{6}\),则期望掷\(6\)次可以第一次得到\(3\))。

这个还是不好求,我们转而求操作一次,\(s\)中的点一个都覆盖不到的概率\(p'\),则\(p=1-p',E(s)=\frac{1}{1-p'}\)。

考虑如果暴力枚举一个子集\(s\)。则整个数列被\(s\)内的点划分成若干个区间,设长度分别为:\(l_1,l_2,...,l_k\)。则\(p'=\frac{\sum_{i=1}^{k}\frac{1}{2}l_i(l_i+1)}{\frac{1}{2}n(n+1)}\)。复杂度\(O(2^nn)\),无法承受。

考虑DP。设\(dp(i,j,k,0/1)\)表示考虑了前\(i\)个位置,最多能取\(j\)个区间\((j\leq \frac{1}{2}n(n+1))\),使得没有区间覆盖到点集内的点。上一次选的点集里的点距离\(i\)为\(k\),点集的大小奇偶性为\(0/1\)。这样选出区间的方案数。

转移时考虑第\(i+1\)个位置是否加入点集:

  • 如果加入点集:\(f(i+1,j,0,1/0)+=f(i,j,k,0/1)\).

  • 如果不加入点集:\(f(i+1,j+k+1,k+1,0/1)+=f(i,j,k,0/1)\).

转移是\(O(1)\)的,所以DP的复杂度\(O(n^4)\)。

统计答案时把所有\(j\)的情况加起来即可。即:\(ans(n)=\displaystyle\sum_{j=0}^{\frac{1}{2}n(n+1)-1}\frac{f(n,j,k,0/1)\times(-1)^{1/0}}{1-\frac{j}{\frac{1}{2}n(n+1)}}\).

备注:具体实现的时候把分数上下同时乘以\(\frac{1}{2}n(n+1)\)会更好写。式子上面的\(k\)表示所有\(k\)的情况的和。\((-1)\)的指数上的\(0/1\)之所以和状态里的\(0/1\)相反是因为minmax容斥的式子本来就是\((-1)^{|t|+1}\)。

注意本题要使用高精度。

参考代码:

//problem:hdu4624
#include <bits/stdc++.h>
using namespace std; #define pb push_back
#define mk make_pair
#define lob lower_bound
#define upb upper_bound
#define fst first
#define scd second typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii; namespace Fread{
const int MAXN=1<<20;
char buf[MAXN],*S,*T;
inline char getchar(){
if(S==T){
T=(S=buf)+fread(buf,1,MAXN,stdin);
if(S==T)return EOF;
}
return *S++;
}
}//namespace Fread
#ifdef ONLINE_JUDGE
#define getchar Fread::getchar
#endif
inline int read(){
int f=1,x=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline ll readll(){
ll f=1,x=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
/* ------ by:duyi ------ */ // dysyn1314 namespace Bigdouble{
const int K=50;
typedef long long ll;
struct db{ll zs,xs[K+5];db(){zs=0;memset(xs,0,sizeof(xs));}};
db makedb(ll fz,ll fm){
db res;
res.zs=fz/fm,fz%=fm,fz*=10;
for(int i=1;i<=K;++i)res.xs[i]=fz/fm,fz%=fm,fz*=10;
return res;
}
db operator + (db a,db b){
db res;ll jw=0;
for(int i=K;i>=1;--i)res.xs[i]=a.xs[i]+b.xs[i]+jw,jw=res.xs[i]/10,res.xs[i]%=10;
res.zs=a.zs+b.zs+jw;
return res;
}
db operator - (db a,db b){
db res;
for(int i=K;i>=2;--i){
if(a.xs[i]<b.xs[i])a.xs[i-1]--,a.xs[i]+=10;
res.xs[i]=a.xs[i]-b.xs[i];
}
if(a.xs[1]<b.xs[1])a.zs--,a.xs[1]+=10;
res.xs[1]=a.xs[1]-b.xs[1];
res.zs=a.zs-b.zs;
return res;
}
db operator * (db a,ll b){
db res;
ll jw=0;
for(int i=K;i>=1;--i)res.xs[i]=a.xs[i]*b+jw,jw=res.xs[i]/10,res.xs[i]%=10;
res.zs=a.zs*b+jw;
return res;
}
void printdb(db a,int k=15){
if(a.xs[k+1]>=5)a.xs[k]++;
int t=k;
while(a.xs[t]>=10){
a.xs[t]-=10;
if(t!=1)a.xs[--t]++;
else{a.zs++;break;}
}
cout<<a.zs<<".";
for(int i=1;i<=k;++i)cout<<a.xs[i];
}
}
using namespace Bigdouble;
const int MAXN=55;
ll dp[MAXN][MAXN*MAXN][MAXN][2];
db ans[MAXN];
int main() {
dp[0][0][0][0]=1;
for(int i=0;i<50;++i){
for(int j=0;j<=i*(i+1)/2;++j){
for(int k=0;k<=i;++k){
for(int t=0;t<=1;++t){
dp[i+1][j][0][t^1]+=dp[i][j][k][t];
dp[i+1][j+k+1][k+1][t]+=dp[i][j][k][t];
}
}
}
}
for(int n=1;n<=50;++n){
for(int j=0;j<n*(n+1)/2;++j){
db tmp=makedb(n*(n+1)/2,n*(n+1)/2-j);
ll sum=0;
for(int k=0;k<=n;++k)sum+=dp[n][j][k][0];
ans[n]=ans[n]-(tmp*sum);
sum=0;
for(int k=0;k<=n;++k)sum+=dp[n][j][k][1];
ans[n]=ans[n]+(tmp*sum);
}
}
//for(int n=1;n<=50;++n)printf("%d\n",n),printdb(ans[n]),puts("");return 0;
int t=read();while(t--){
int n=read();
printdb(ans[n]);puts("");
}
return 0;
}

题解 hdu4624 Endless Spin的更多相关文章

  1. HDU4624 Endless Spin 和 HAOI2015 按位或

    Endless Spin 给你一段长度为[1..n]的白色区间,每次随机的取一个子区间将这个区间涂黑,问整个区间被涂黑时需要的期望次数. n<=50 题解 显然是min-max容斥,但是n的范围 ...

  2. HDU4624 Endless Spin 【最大最小反演】【期望DP】

    题目分析: 题目是求$E(MAX_{i=1}^n(ai))$, 它等于$E(\sum_{s \subset S}{(-1)^{|s|-1}*min(s))} = \sum_{s \subset S}{ ...

  3. HDU4624 Endless Spin(概率&&dp)

    2013年多校的题目,那个时候不太懂怎么做,最近重新拾起来,看了一下出题人当初的解题报告,再结合一下各种情况的理解,终于知道整个大致的做法,这里具体写一下做法. 题意:给你一段长度为[1..n]的白色 ...

  4. Endless Spin

    clj的题.图是假的别看 得先做这个[HAOI2015]按位或 本题如果还用[HAOI2015]按位或 的方法,2^50拜拜 但是思路一定是这样的:min-max容斥,考虑每个S的第一触及次数期望 这 ...

  5. [模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演

    //待更qwq 反演原理 二项式反演 若 \[g_i=\sum_{j=1}^i {\binom ij} f_j\] , 则有 \[ f_i=\sum_{j=1}^i (-1)^{i-j} {i \ch ...

  6. ZROI 暑期高端峰会 A班 Day1 组合计数

    AGC036F Square Constriants 一定有 \(l_i<p_i\le r_i\). 考虑朴素容斥,枚举每个数是 \(\le l_i\) 还是 \(\le r_i\).对于 \( ...

  7. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  8. csp-s模拟47 Emotional Flutter,Endless Fantasy题解

    题面:https://www.cnblogs.com/Juve/articles/11558523.html A:Emotional Flutter 如果起点确定,那么我们后面走的点都是固定的,及mo ...

  9. ZJOI2012网络 题解报告【LCT】

    题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构成的环. 在这 ...

随机推荐

  1. 国外最受欢迎的15个BT下载网站

    1.EYH.BIZ 海盗湾(The Pirate Bay)现在在中国成立的一个分部 www.eyh.biz 一个提供BT种子文件和链接,以方便使用BT协议的对等文件共享网站.该网站于2003年在瑞典创 ...

  2. 秋招落幕,对自己的总结by2018-10-20

    在今天阿里沟通offer完毕,正式三方也确定了,一切如梦,想想1月的自己还担心未来的自己会花落谁家,到10月的今天,一切尘埃落地.一直不怎么喜欢总结自己的历程,今天无聊的我也总结一波吧. 准确的说没有 ...

  3. knockout 简单使用

    定义: var QcViewModel = function () { var self = this; self.name = ko.observable(); self.qty = ko.obse ...

  4. django xadmin中logout页面在chrome浏览器中点击关闭页面无效

    问题现象 django xadmin中logout页面在chrome浏览器中点击关闭页面无效,无法关闭相应的页面 问题原因 高版本的chrome等浏览器不支持在window.colse()的写法 问题 ...

  5. el-select 选项值动态更新的问题

      如果 类似 el-select 等表单元素绑定了 类似 a.b 之类的属性,而不是直接的一级属性的话,当这个属性发生更改的时候,它的显示效果可能不会动态地进行更新,这个时候需要使用 Vue.$se ...

  6. VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.

    方案一: sudo vim /etc/sysctl.conf 增加下面内容(环境变量) fs.inotify.max_user_watches = 1638400 fs.inotify.max_use ...

  7. Hibernate框架:org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java92)

    报错信息 org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate.exception. ...

  8. day1-1JavaScript概念

    Js概念: 产生于低速网时代,是进行表单验证 与html和css结合后产生动态效果(能用css实现的动画效果就不要用js实现,因为js效率比css低) js = ECMAScript +  dom   ...

  9. 在abp core中出现运行项目时EF获取到的appsetting.json或者appsettings.Production.json中的连接字符串为空

    原因:有可能是生成的bin或者debug文件夹下没有将appsetting.json或者appsettings.Production.json文件生成过去 解决方法:手动拷贝过去,或者设置成自动生成过 ...

  10. checkbox全选/取消全选

    //checkbox全选/取消全选 $(function() { $("#checkAll").click(function() { if(this.checked){ $(&qu ...