【bzoj4036】按位或
Solution
感觉容斥的东西内容有点qwq多啊qwq还是以题目的形式来慢慢补档好了
这里补的是min-max容斥
其实min-max容斥好像。。只是一个形式而已。。本质还是普通容斥==
记\(max(S)\)表示集合\(S\)中最大的元素,记\(min(S)\)表示集合中最小的元素,那么:
min(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1}max(T)\\
\]
这个是最基本的形式
然后对于第一条式子这里记录一个sk学长提供的比较直观的证明:
对于\(S\)这个数集,我们将其中的每一个元素\(x\)看成一个\(\{1,2,3,...,x\}\)的集合,这样\(S\)就变成了一个集合的集合(我们记为\(S'\)),原来数集\(S\)中的最大值就可以看成现在\(S'\)中所有集合的并的大小,最小值就可以看成\(S'\)中所有所有集合的交的大小,然后我们有这样一条式子来求一堆集合的并的大小:
\]
然后我们就发现其实这个稍微转换一下其实就是:
\]
至于\(min\)的那条怎么证的话。。我们只要把数集\(S\)中的每一个元素\(x\)看成一个\(\{x+1,x+2,...inf\}\)的集合,同样将\(S\)转成一个集合的集合\(S'\),然后最小值操作就变成了\(inf-\)集合的并,最大值操作就变成了\(inf-\)集合的交,然后就\(inf\)的话系数那里稍微抵消一下之类的最后只剩下一个\(inf\),那么其他的就跟上面一样了
然后这个东西在期望中也是适用的,也就是:
E(min(S))=\sum\limits_{T\subseteq S}(-1)^{|T|-1}E(max(S))\\
\]
具体为什么。。首先补一个容斥原理在概率中的应用:
对于事件\(A_i(1<=i<=n)\),我们记\(P(A_i)\)表示\(A_i\)事件发生的概率,那么至少一个事件发生的概率是:
\]
然后\(E\)那个式子的证明什么的。。只要暴力展开一下然后发现就是普通容斥然后就没有然后了==
直接讲不太好说,还是放在题目里面比较好
比如说这题
稍微转化一下题意,其实就是有一个集合\(S\),然后每秒给你\(S\)的任意一个子集(不同子集概率不同),求期望多少秒之后手头上的所有子集的并首次等于\(S\)
首先无解的话就是所有有值的\(P\)对应的数或起来都还得不到全集
接下来就只讨论有解的情况
我们记\(max(S)\)表示集合\(S\)中最后被或到的那个子集(也就是最后一个取到的数),\(min(S)\)表示集合\(S\)中第一个被或到的子集(也就是第一个取到的数),加上个\(E\)在这里表示的就是期望时间,那么我们有:
\]
我们其实可以把\(E(max(S))\)理解成我们要的答案,\(E(min(T))\)理解成或到集合的任意一个子集的期望时间,那\(E(min(T))\)是很好求的,只要把所有子集的\(P\)求个和得到概率,然后用\(1\)除一下就好了:\(E(min(T))=\frac{1}{\sum\limits_{S'\cap T \neq \emptyset}P(S')}\)
那所以我们只要求出\(\sum\limits_{S'\cap T \neq \emptyset}P(S')\)就可以了,这里需要稍微转化一下:
\]
所以我们现在要对于每一个原集合\(S\)的子集\(T\),求出\(\sum\limits_{s'\subseteq T}P(s')\),调用的时候带补集进去就好了
到这一步我们重新将这个问题转化回数,也就是说我们其实是要对于\([0,2^n-1]\)范围内的每一个数\(i\)求\(f[i]=\sum\limits_{j|i=i}p_j\)
那么这个用FMT来求(其实就是按照某个顺序转移,Portal-->lcm这题中有用到类似的方法,不再赘述)或者直接FWT来求就好了(FWT的话就是。。或卷积在构造的时候那个形式恰好就是\(f[i]=\sum\limits_{j|i=i}a[i]\),所以可以直接对原来的\(p\)数组进行FWT然后直接用就行了)
然后这题就做完了
代码大概长这个样子(是FMT的写法)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=(1<<20)+10;
const double eps=1e-6;
int cnt[N];
double p[N],f[N];
int n,m,all;
bool in(int st,int x){return st>>x&1;}
int St(int x){return 1<<x;}
void prework(){
for (int i=0;i<all;++i) f[i]=p[i];
for (int i=0;i<n;++i)
for (int j=0;j<all;++j)
if (in(j,i))
f[j]+=f[j^St(i)];
cnt[0]=0;
for (int i=0;i<all;++i) cnt[i]=cnt[i>>1]+(i&1);
}
bool check(){
int st=0;
for (int i=0;i<all;++i)
if (fabs(p[i])>eps) st|=i;
return st==(all-1);
}
void solve(){
double ans=0;
for (int i=1;i<all;++i)
if (cnt[i]&1)
ans+=1.0/(1.0-f[(all-1)-i]);
else
ans-=1.0/(1.0-f[(all-1)-i]);
printf("%.10lf\n",ans);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&n);
all=1<<n;
for (int i=0;i<all;++i) scanf("%lf",p+i);
if (!check()){printf("INF\n");return 0;}
prework();
solve();
}
【bzoj4036】按位或的更多相关文章
- min-max容斥 hdu 4336 && [BZOJ4036] 按位或
题解: 之前听说过这个东西但没有学 令$max(S)$表示S中编号最大的元素,$min(S)$表示编号中最小的元素 $$max(S)=\sum{T \in S} {(-1)}^{|T|+1} min( ...
- BZOJ4036 按位或
解:有两种做法...... 第一种,按照秘密袭击coat的套路,我们只需要求出即可.因为一种操作了i次的方案会被恰好计数i次. 那么这个东西怎么求呢?直接用FWT的思想,对于一个状态s,求出选择s所有 ...
- Min-Max容斥及其推广和应用
概念 Min-Max容斥,又称最值反演,是一种对于特定集合,在已知最小值或最大值中的一者情况下,求另一者的算法. 例如: $$max(a,b)=a+b-min(a,b) \\\ max(a,b,c)= ...
- BZOJ4036 [HAOI2015]按位或 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4036.html 题目传送门 - BZOJ4036 题意 刚开始你有一个数字 $0$ ,每一秒钟你会随机 ...
- 【BZOJ4036】[HAOI2015]按位或 FWT
[BZOJ4036][HAOI2015]按位或 Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or ...
- 【BZOJ4036】按位或(Min-Max容斥,FWT)
[BZOJ4036]按位或(Min-Max容斥,FWT) 题面 BZOJ 洛谷 题解 很明显直接套用\(min-max\)容斥. 设\(E(max\{S\})\)表示\(S\)中最晚出现元素出现时间的 ...
- bzoj4036 / P3175 [HAOI2015]按位或
bzoj4036 / P3175 [HAOI2015]按位或 是一个 min-max容斥 的板子题. min-max容斥 式子: $ \displaystyle max(S) = \sum_{T\su ...
- BZOJ4036 HAOI2015按位或(概率期望+容斥原理)
考虑min-max容斥,改为求位集合内第一次有位变成1的期望时间.求出一次操作选择了S中的任意1的概率P[S],期望时间即为1/P[S]. 考虑怎么求P[S].P[S]=∑p[s] (s&S& ...
- BZOJ4036 [HAOI2015]按位或 【minmax容斥 + 期望 + FWT】
题目链接 BZOJ4036 题解 好套路的题啊,,, 我们要求的,实际上是一个集合\(n\)个\(1\)中最晚出现的\(1\)的期望时间 显然\(minmax\)容斥 \[E(max\{S\}) = ...
随机推荐
- python装饰器简单使用
装饰器和闭包关联很大,要先明白闭包是什么 原始代码: def foo(): print('fcc') 增加装饰器 from time import ctime,sleep def w(fcc): de ...
- artDialog基本使用
artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口l 自适应内容artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适 ...
- Jenkins 自动化测试
学习 Jenkins 自动化测试的系列文章 Robot Framework 概念 Robot Framework 安装 Pycharm + Robot Framework 环境搭建 Robot Fra ...
- 【Python入门学习】列表生成和函数生成器的方式实现杨辉三角
列表生成: L = [i for i in range(10)] 列表生成器: g = (i for i in range(10)) 函数生成器使用的关键字yield实现 例如fib生成器 def f ...
- DX孟虎点评新兴市场:巴西俄罗斯火爆背后
[亿邦动力网讯]4月3日消息,在第九届中国中小企业电子商务大会暨2014中国(河南)跨境贸易电子商务峰会上,DX公司CEO孟虎对新兴市场做了详细的分析,指出在当今的跨境电商环境下,北美.西欧作为电商成 ...
- linux-ubuntu配置通过22端口远程连接
当安装好ubuntu后获取到对应主机的ip地址,要想通过类似xshell这样的远程连接工具连接到ubuntu主机,需要在你刚刚安装好的ubuntu主机上安装openssh这个软件,才能通过远程来连接u ...
- 福大软工1816:Beta(4/7)
Beta 冲刺 (1/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 准备四六级 展示GitHub当日代码/ ...
- Java微笔记(5)
final关键字 super关键字
- HDU 5496 Beauty of Sequence
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5496 Beauty of Sequence Problem Description Sequence ...
- lintcode-477-被围绕的区域
477-被围绕的区域 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O ...