BZOJ4036 按位或


解:有两种做法......
第一种,按照秘密袭击coat的套路,我们只需要求出
即可。因为一种操作了i次的方案会被恰好计数i次。
那么这个东西怎么求呢?直接用FWT的思想,对于一个状态s,求出选择s所有子集的概率ps。那么第i次操作后是s的子集的概率就是psi。
设fs表示第i次操作之后是s的子集的概率。

把所有的f求出来之后做一次IFWT即可。然后我们对于所有非全集求和。
参考资料。
#include <bits/stdc++.h> const int N = , M = ;
const double eps = 1e-; double f[M], p[M], w[M];
int cnt[M], pw[M], n, lm; inline void FWT_or(double *a, int n, int f) {
for(int len = ; len < n; len <<= ) {
for(int i = ; i < n; i += (len << )) {
for(int j = ; j < len; j++) {
a[i + len + j] += f * a[i + j];
}
}
}
return;
} int main() {
scanf("%d", &n);
lm = << n;
for(int i = ; i < lm; i++) {
scanf("%lf", &p[i]);
w[i] = p[i];
if(i) {
cnt[i] = + cnt[i - (i & (-i))];
}
if(i > ) {
pw[i] = pw[i >> ] + ;
}
}
FWT_or(p, lm, );
for(int i = ; i < lm; i++) {
if(i != lm - && p[i] > - eps) {
puts("INF");
return ;
}
f[i] = 1.0 / ( - p[i]);
}
FWT_or(f, lm, -);
double ans = ;
for(int i = ; i < lm - ; i++) {
ans += f[i];
}
printf("%.10f\n", ans);
return ;
}
AC代码
第二种:Min-Max容斥。
设fs为把状态s的所有元素中至少一个变成1的期望次数。
同样是对步数0~∞求和,每次的概率是(没选到)i。最后Min-Max容斥统计答案。
#include <bits/stdc++.h> const int N = , M = ;
const double eps = 1e-; double f[M], p[M], w[M];
int cnt[M], pw[M], n, lm; inline void FWT_or(double *a, int n, int f) {
for(int len = ; len < n; len <<= ) {
for(int i = ; i < n; i += (len << )) {
for(int j = ; j < len; j++) {
a[i + len + j] += f * a[i + j];
}
}
}
return;
}
/*
2
0.25 0.25 0.25 0.25 */
int main() {
scanf("%d", &n);
lm = << n;
for(int i = ; i < lm; i++) {
scanf("%lf", &p[i]);
w[i] = p[i];
if(i) {
cnt[i] = + cnt[i - (i & (-i))];
}
if(i > ) {
pw[i] = pw[i >> ] + ;
}
}
FWT_or(p, lm, );
for(int i = ; i < lm; i++) {
if(i != lm - && p[i] > - eps) {
printf("INF\n");
return ;
}
//printf("p %d = %lf \n", i, p[i]);
f[i] = 1.0 / ( - p[(lm - ) ^ i]);
}
//FWT_or(f, lm, -1);
double ans = ;
for(int i = ; i < lm; i++) {
if(cnt[i] & ) ans += f[i];
else ans -= f[i];
}
printf("%.10f\n", ans);
return ;
}
AC代码
BZOJ4036 按位或的更多相关文章
- min-max容斥 hdu 4336 && [BZOJ4036] 按位或
题解: 之前听说过这个东西但没有学 令$max(S)$表示S中编号最大的元素,$min(S)$表示编号中最小的元素 $$max(S)=\sum{T \in S} {(-1)}^{|T|+1} min( ...
- 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\}) = ...
- 【bzoj4036】按位或
Portal --> bzoj4036 Solution 感觉容斥的东西内容有点qwq多啊qwq还是以题目的形式来慢慢补档好了 这里补的是min-max容斥 其实min-max容斥 ...
随机推荐
- 测者的性能测试手册:Web压力测试工具webbench
webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: wget http:/ ...
- ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门
一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...
- SQLServer之创建INSTEAD OF INSERT,UPDATE,DELETE触发器
INSTEAD OF触发器工作原理 INSTEAD OF表示并不执行其所定义的操作INSERT,UPDATE ,DELETE,而仅是执行触发器本身,即当对表进行INSERT.UPDATE 或 DELE ...
- 怎样保证socket.recv接收完数据
最近在使用python进行网络编程开发一个通用的tcpclient测试小工具.在使用socket进行网络编程中,如何判定对端发送一条报文是否接收完成,是进行socket网络开发必须要考虑的一个问题.这 ...
- 【Python 10】汇率兑换3.0(while循环)
1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 2.案 ...
- linux用户身份和文件权限
1.用户身份与能力 root管理员是linux 的超级用户,他拥有系统的所有权,能够管理系统的各项功能,如添加/删除用户,启动/关闭服务进程,开启/禁用硬件设备…… "Linux系统中的管理 ...
- IDEA远程调试监控端口
大家知道,线上环境定位问题不是那么简单的,如果有非常完善的日志以及监控系统是不必担心的,但是应对这些并不完善的场景下,IDEA提供了一种远程调试的功能,remote集成了可以远程调试的功能,只需要在你 ...
- js 运行机制
<script> console.log(1) setTimeout(function(){ console.log(3) },0) console.log(2) </script& ...
- sql 日常使用记录
sql 某个字段在哪些表中存在: select sysobjects.name from syscolumns inner join sysobjects on syscolumns.id = sys ...
- MySql下实现先排序后分组
最近在工作中遇到一个先排序后分组的需求,发现MySql不同的版本有不同的结果,特此记录. 举例:要求在shop表中查询出各类型商店中价格最高的商品. --表结构-- create table `sho ...