题目链接

题目大意:

有长度为\(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. TreeView 中 MVVM Command Binding

    <HierarchicalDataTemplate x:Key="TreeNodes" ItemsSource="{Binding Path=Childs,Mode ...

  2. idea修改项目编码

  3. Centos7 [ubuntu] 安装pycharm2019.1.3并永久破解教程

    一.安装pycharm2019专业版并激活步骤 1.拉取安装包 # wget   https://download.jetbrains.com/python/pycharm-professional- ...

  4. cmd命令下载maven管理需要的依赖jar包

    首先在maven官网https://mvnrepository.com/  搜索你需要的jar包,找到下面的下载链接,在修改命令,然后cmd下载. cmd命令下载Maven需要jar包 cmd输入下面 ...

  5. Python开发个人专属表情包网站

    “表情包”是一种利用图片来表示感情的一种方式.表情包是在社交软件活跃之后,形成的一种流行文化,表情包流行于互联网上面,基本人人都会发表情. 曾经你是否也有过找不到表情包去应对别人的时候. 今天小编分享 ...

  6. tornado框架的简单实用

    一.安装模块 pip3 install tornado 二.简单的起服务的方法 import json, datetime from tornado.web import RequestHandler ...

  7. Python - 模块中的"if __name__ == '__main__':"

    1.1 如果导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码. module1.py: def foo(): print('module 1') f ...

  8. iOS开发应用上架必读最新苹果审核规则(史上最全版)

    官方文档 地址https://developer.apple.com/cn/app-store/review/guidelines/ App Store 审核指南 简介 App 正在改变世界,丰富人们 ...

  9. Airless Pump Bottle For The Rise Of Cosmetic Packaging Solutions

    Airless Pump Bottle    are used in the rise of cosmetic packaging solutions. According to the suppli ...

  10. 匈牙利命名法、Camel命名法与Pascal命名法

    Camel命名法:即骆驼式命名法,首字母小写,采用该命名法的名称看起来就像骆驼的驼峰一样高低起伏.Camel命名法有两种形式: 1.混合使用大小写字母,例如runFast 2.单词之间加下划线,例如r ...