首页 > 其他分享 >P3175 [HAOI2015] 按位或(min-max 容斥)

P3175 [HAOI2015] 按位或(min-max 容斥)

时间:2024-12-22 21:54:08浏览次数:4  
标签:min max sum 容斥 cdots include define

题意

有一个初始为 \(0\) 的变量 \(x\),每次操作会以 \(p_i\) 的概率选择位于 \([0,2^n)\) 中的某个整数 \(i\),并将 \(x\) 或上 \(i\)。问期望几次操作后 \(x=2^n-1\)。

\(n\le 20,\sum p_i=1\)

引入:min-max 容斥

以两个式子入手:

\[\max(S)=\sum_{T\subseteq S} (-1)^{|T|+1}\min(T) \]

\[\min(S)=\sum_{T\subseteq S} (-1)^{|T|+1}\max(T) \]

两个式子的证明都大差不差,不妨证明第一个。

令 \(S=\{a_1,a_2,\cdots,a_n\}\),其中 \(a_1<a_2<\cdots<a_n\),考虑拆贡献,求出每个 \(a_i\) 对 \(\max(S)\) 的贡献的系数是多少。

不妨钦定 \(a_i\) 就是 \(\min(T)\),那么 \(a_i\) 往后的元素都可以任意选,那 \(a_i\) 的系数就是 \(\sum_{j=0}^{n-i}(-1)^j\binom{n-i}{j}\),这里是 \((-1)^j\) 不是 \((-1)^{j+1}\) 的原因是我们已经钦定 \(a_i\) 选了,所以少乘一个 \(-1\) 的系数。二项式定理可得 \(\sum_{j=0}^{n-i}(-1)^j\binom{n-i}{j}=(1-1)^{n-i}=[n=i]\)。也就是说,如果 \(a_i\) 不是 \(a_n\) 那么系数为 0,否则为 1。\(a_n\) 即是最大值,得证。

这个东西在一般的求最小值的题目下可能没啥用,但是这个东西在期望的意义下也是成立的(期望的线性性),即:

\[E(\max(S))=\sum_{T\subseteq S} (-1)^{|T|+1}E(\min(T)) \]

\[E(\min(S))=\sum_{T\subseteq S} (-1)^{|T|+1}E(\max(T)) \]

当 \(E(\max)\) 或 \(E(\min)\) 不好求且另外一个相对好求时,我们可以使用 min-max 容斥解决题目。

分析

将 \(x\) 拆位,设 \(t_i\) 表示第 \(i\) 位变成 1 的时刻,那么我们要求的就是 \(E(\max(t_i))\)。

考虑 min-max 容斥,将式子变为 \(\sum_{T\subseteq \{1,2,\cdots,n\},T\neq \emptyset} E(\min(T))\)。

我们有结论:设 \(p\) 表示选中与 \(T\) 有交的数的概率,那么有 \(E=\frac{1}{p}\)。

证明:

将期望按照定义展开,\(E=p(1-p)^0+2p(1-p)^1+3p(1-p)^2+\cdots\),考虑错位相减,\((1-p)E=p(1-p)^1+2p(1-p)^2+3p(1-p)^3+\cdots\),相减得 \(pE=p(1-p)^0+p(1-p)^1+p(1-p)^2+\cdots\),也即 \(E=(1-p)^0+(1-p)^1+(1-p)^2+\cdots\),套用等比数列求和公式得 \(E=\frac{1}{p}\)。

当然也有另外一种证法,考虑 DP,将 \(E\) 视为一个 DP 状态,有转移 \(E=1+(1-p)E\),意义就是,我花费了一次操作,如果随到了与 \(T\) 有交的数(概率为 \(p\)),就结束了,否则要继续操作,此时局面和操作前一样,所以从 \((1-p)E\) 转移来。解方程得 \(E=\frac{1}{p}\)。

问题转化成了求 \(p\)。正着做稍微有点困难,考虑求选中与 \(T\) 无交的数的概率,即 \(1-p\),不难发现这其实就是 \(T\) 的补集的所有子集的概率之和,高维前缀和即可。

还有一个小细节,当 \(p=0\) 时,此时 \(\frac{1}{p}\) 等于无穷大,所以要再开一个数组 \(cnt\) 记录 \(\frac{1}{0}\) 的系数是多少,若不为 0 则输出 INF。

时间复杂度 \(O(n2^n)\)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<set>
#include<array>
#include<ctime>
#include<random>
#include<cassert>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P0 puts("0")
#define P__ puts("")
#define PU puts("--------------------")
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define un using namespace
#define all(x) x.begin(),x.end()
#define mem(x,y) memset(x,y,sizeof x)
#define rep(a,b,c) for(int a=(b);a<=(c);++a)
#define per(a,b,c) for(int a=(b);a>=(c);--a)
#define reprange(a,b,c,d) for(int a=(b);a<=(c);a+=(d))
#define perrange(a,b,c,d) for(int a=(b);a>=(c);a-=(d))
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) ((x)&-(x))
#define lson(x) ((x)<<1)
#define rson(x) ((x)<<1|1)
//#define double long double
//#define int long long
//#define int __int128
using namespace std;
using i64=long long;
using u64=unsigned long long;
using pii=pair<int,int>;
template<typename T1,typename T2>inline void ckmx(T1 &x,T2 y){x=x>y?x:y;}
template<typename T1,typename T2>inline void ckmn(T1 &x,T2 y){x=x<y?x:y;}
inline auto rd(){
	int qwqx=0,qwqf=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')qwqf=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){qwqx=(qwqx<<1)+(qwqx<<3)+ch-48;ch=getchar();}return qwqx*qwqf;
}
template<typename T>inline void write(T qwqx,char ch='\n'){
	if(qwqx<0){qwqx=-qwqx;putchar('-');}
	int qwqy=0;char qwqz[40];
	while(qwqx||!qwqy){qwqz[qwqy++]=qwqx%10+48;qwqx/=10;}
	while(qwqy--)putchar(qwqz[qwqy]);if(ch)putchar(ch);
}
bool Mbg;
const int maxn=21,maxm=(1<<20),inf=0x3f3f3f3f;
const double eps=1e-10;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,m;
double a[maxm],f[maxm];
inline void solve_the_problem(){
	n=rd(),m=(1<<n);
	rep(i,0,m-1)scanf("%lf",&a[i]);
	rep(i,0,m-1)f[i]=a[i];
	rep(j,0,n-1)rep(i,0,m-1)if((i>>j)&1)f[i]+=f[i^(1<<j)];
	double ans=0;
	int cnt=0;
	rep(S,1,m-1){
		double p=1-f[(m-1)^S];
		int siz=__builtin_popcount(S);
		if(p<eps){
			if(siz&1)++cnt;
			else --cnt;
		}else{
			if(siz&1)ans+=1.0/p;
			else ans-=1.0/p;
		}
	}
	if(cnt)puts("INF");
	else printf("%.9lf",ans);
}
bool Med;
signed main(){
//	freopen(".in","r",stdin);freopen(".out","w",stdout);
	fprintf(stderr,"%.3lfMB\n",(&Mbg-&Med)/1048576.0);
	int _=1;
	while(_--)solve_the_problem();
}
/*

*/

标签:min,max,sum,容斥,cdots,include,define
From: https://www.cnblogs.com/dcytrl/p/18622533

相关文章

  • WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6 开心版
    WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6开心版;CeoMax-Pro是一款极致美观强大的WordPress付费资源下载主题,它能满足您所有付费资源下载的业务需求!你的想法与业务不能被主题所限制!CeoMax-Pro强大的功能,在不久的将来它能实现你一切幻想!我们也在为此而不断努力。适......
  • CF1324F Maximum White Subtree
    看到题目最直接的想法就是以每个节点为根进行nnn次树形dp......
  • Maxpooling 深度解析:原理、应用与优化
    引言在深度学习的世界里,卷积神经网络(CNN)已经成为图像识别、语音处理和自然语言处理等领域的核心模型。而Maxpooling作为CNN中的重要操作之一,通过下采样减少数据维度,在保留关键特征的同时显著降低计算复杂度。本文将深入探讨Maxpooling的原理、应用场景,并结合具体实例......
  • webbroker调用axios.min.js
    <head><scriptsrc="axios.min.js"></script></head><body><p>实现前端调用后端的HTTP请求的方法:<br>https://www.cnblogs.com/hgdzjp/p/9438893.html</p><pid="demo22">aaa</p><scri......
  • 5G NR-Beamforming 的一些基本理论
    诞生背景在无线通信中,传统的信号传输通常是全向广播的(全向天线),即信号均匀地在各个方向上发射,导致信号的能量被分散,效率较低。全向天线辐射图而波束赋形技术通过使用多个天线阵列(如MIMO系统),根据信号的需求将信号定向发射,形成具有高度指向性的“波束”。这样可以提高信号强度......
  • Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)D题
    D-RepeatedSequence 思路:先存储数组的前缀和,把周期的和剪掉,这样就只需要查找在一个周期是否满足,枚举1-n,毕竟不确定周期是从哪开始的,对于从当前数为起始的周期,当剩余的数res小于从当前i为起点的i后缀和时,我们只需要查找一个R 满足b[r]-b[i-1]区间和等于res,若最后查......
  • VideoCrafter2: Overcoming Data Limitations for High-Quality Video Diffusion Mode
    目录一、概述 二、相关工作三、VideoCrafter21、时间空间扰动下的的关联分析空间模块时间模块 2、数据层下的外观和运动的分离3、概念组合能力四、实验一、概述     该论文提出在数据层面从分离运动和外观来从没有高质量视频中训练高质量的视频模型,......
  • 【模块一】kubernetes容器编排进阶实战之基于velero及minio实现etcd数据备份与恢复
    基于velero及minio实现etcd数据备份与恢复Velero简介及minio环境准备Velero简介:Velero是vmware开源的一个云原生的灾难恢复和迁移工具,它本身也是开源的,采用Go语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源数据,Velero。Velero是西班牙语意思是帆船,非常符合K......
  • Set-MMAgent -MaxOperationAPIFiles 的主要功能是设置 Microsoft Monitoring Agent (M
    mmagentApplicationLaunchPrefetching:FalseApplicationPreLaunch    :FalseMaxOperationAPIFiles    :8192MemoryCompression      :FalseOperationAPI        :FalsePageCombining        :FalsePS......
  • Introducing Gemini 2.0: our new AI model for the agentic era
    IntroducingGemini2.0:ournewAImodelfortheagenticerahttps://blog.google/technology/google-deepmind/google-gemini-ai-update-december-2024/#ceo-message Gemini2.0FlashGemini2.0Flashbuildsonthesuccessof1.5Flash,ourmostpopularmod......