UOJ 422 - 【集训队作业2018】小Z的礼物(Min-Max 容斥+轮廓线 dp)
本来说要找道轮廓线 \(dp\) 的题目刷刷来着的?然后就找到了这道题。
然鹅这个题给我最大的启发反而不在轮廓线 \(dp\),而在于让我新学会了一个玩意儿叫做 Min-Max 容斥。
Min-Max 容斥大概讲的就是这样一件事情:对于任意集合 \(S\),\(\max(S)=\sum\limits_{T\subseteq S,T\ne\varnothing}(-1)^{|T|-1}\min(T)\),因为这个式子包含容斥系数 \((-1)^{|T|-1}\) 和集合的 \(\min,\max\),因此被称为 Min-Max 容斥。
证明还算容易,假设 \(S\) 中的元素从小到大依次为 \(a_1,a_2,\cdots,a_n\),考虑每个 \(a_i\) 作为最小值出现的贡献,显然 \(a_n\) 的贡献就是 \(a_n\),因为它只能在 \(T=\{a_n\}\) 中作为最小值,而对于 \(i<n\),\(a_i\) 为 \(T\) 的最小值当且仅当 \(T\) 可以写成 \(\{a_i\}\cup T'\) 的形式,其中 \(T'\subseteq\{a_{i+1},a_{i+2},\cdots,a_n\}\),考虑枚举 \(T'\) 的大小 \(s\),那么共有 \(\dbinom{n-i}{s}\) 个可选的 \(T'\),它们的贡献均为 \((-1)^s\),故总贡献为 \(\sum\limits_{i=0}^{n-i}\dbinom{n-i}{s}(-1)^s=0^{n-i}=0\),故总贡献就是 \(a_n=\max(S)\)。
接下来考虑怎样将 Min-Max 容斥使用到这道题上,我们考虑将所有 * 格子编个号,记 \(t_i\) 为编号为 \(i\) 的 * 格第一次被覆盖的时间,那么题目要求的值即为 \(E(\max\{t_i\})\),我们知道对于这样的集合,\(\max\) 是不太好求的,不过 \(E(\min\{t_i\})\) 非常好求,记 \(C\) 为有多少个 \(1\times 2\) 的矩形包含至少一个 * 格,\(D\) 为总共有多少个 \(1\times 2\) 的矩形(显然 \(D=n(m-1)+m(n-1)\)),那么 \(E(\min\{t_i\})=\dfrac{C}{D}\)。因此考虑套用 Min-Max 容斥,记 \(S\) 为 \(t_i\) 组成的集合所有,那么 \(E(\max(S))=\sum\limits_{T\subseteq S}(-1)^{T-1}E(\min(T))\)。直接枚举子集显然是不行的,不过我们发现 \(E(\min\{t_i\})\) 的表达式中,\(D\) 为定值,而 \(C\) 的范围也不会太大,最多不过 \(1200\),因此我们考虑转而枚举 \(C\) 并预处理所有子集 \(T\) 满足其对应的 \(C\) 为我们枚举的值的贡献之和。这东西怎么预处理呢?就要用到我们一开始说的轮廓线 \(dp\) 了,记 \(dp_{i,j,k,l}\) 为考虑了前 \(i\) 列,第 \(i\) 列考虑到了第 \(j\) 行,轮廓线左侧取/不取的状态为 \(k\),有 \(l\) 个 \(1\times 2\) 的矩形包含了至少一个 \(T\) 中的格子的所有子集 \(T\) 的 \((-1)^{|T|-1}\) 之和。搞清楚状态之后转移应该就比较容易了,具体见代码罢。
时间复杂度 \(n^2m^22^n\)。
最后总结一个小 trick,碰到那种形如求 \(E(\max(S))\) 的题目,如果 \(E(\min(S))\) 比较容易求得,那么可以考虑 Min-Max 容斥。
const int MAXN=6;
const int MAXM=100;
const int MAXP=64;
const int MAXCNT=1200;
const int MOD=998244353;
void inc(int &x,int y){((x+=y)>=MOD)&&(x-=MOD);}
int n,m,inv[MAXCNT+5];char s[MAXN+5][MAXM+5];
int dp[MAXM+5][MAXN+5][MAXP+5][MAXCNT+5];
int main(){
scanf("%d%d",&n,&m);int cnt=n*(m-1)+m*(n-1);inv[1]=1;
for(int i=2;i<=cnt;i++) inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
dp[1][1][0][0]=1;if(s[1][1]=='*') dp[1][1][1][0]=MOD-1;
for(int i=1;i<=m;i++) for(int j=1;j<=n;j++)
for(int k=0;k<(1<<n);k++) for(int l=0;l<=cnt;l++){
if(i==m&&j==n) continue;
if(!dp[i][j][k][l]) continue;
int ni=(j==n)?i+1:i,nj=j%n+1,add=0;
if(s[nj][ni]=='*')
inc(dp[ni][nj][k|(1<<nj-1)][l+(ni!=1)+(nj!=1)],MOD-dp[i][j][k][l]);
if((k>>j-1&1)&&(nj!=1)) add++;
if((k>>nj-1&1)) add++;
inc(dp[ni][nj][k&(~(1<<nj-1))][l+add],dp[i][j][k][l]);
}
int ans=0;
for(int i=1;i<=cnt;i++) for(int j=0;j<(1<<n);j++)
ans=(ans+1ll*dp[m][n][j][i]*inv[i]%MOD*cnt)%MOD;
printf("%d\n",MOD-ans);
return 0;
}
UOJ 422 - 【集训队作业2018】小Z的礼物(Min-Max 容斥+轮廓线 dp)的更多相关文章
- UOJ 422 [集训队作业2018] 小Z的礼物 min-max容斥 期望 轮廓线dp
LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- uoj#422. 【集训队作业2018】小Z的礼物(MIn-Max容斥+插头dp)
题面 传送门 题解 好迷-- 很明显它让我们求的是\(Max(S)\),我们用\(Min-Max\)容斥,因为\(Min(S)\)是很好求的,只要用方案数除以总方案数算出概率,再求出倒数就是期望了 然 ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ 449 【集训队作业2018】喂鸽子 【生成函数,min-max容斥】
这是第100篇博客,所以肯定是要水过去的. 首先看到这种形式的东西首先min-max容斥一波,设\(f_{c,s}\)表示在\(c\)只咕咕中,经过\(s\)秒之后并没有喂饱任何一只的概率. \[ \ ...
- [集训队作业2018]蜀道难——TopTree+贪心+树链剖分+链分治+树形DP
题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
随机推荐
- 反调试——11——检测TF标志寄存器
反调试--11--检测TF标志寄存器 在intel的x86寄存器中有一种叫标志寄存器: 标志寄存器中的TF(Trap Flag)位,CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则会产生 ...
- STM32必学的时钟系统
STM32的时钟系统 相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图: 上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟.需要注意的是,上图左侧一 ...
- binary-tree-preorder-traversal leetcode C++
Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary t ...
- 面试官问我JVM内存结构,我真的是
面试官:今天来聊聊JVM的内存结构吧? 候选者:嗯,好的 候选者:前几次面试的时候也提到了:class文件会被类加载器装载至JVM中,并且JVM会负责程序「运行时」的「内存管理」 候选者:而JVM的内 ...
- React + 导入模块的一个错误
导入模块的时候出现这个错误: Attempted import error: 'd3' does not contain a default export (imported as 'd3'). 把导 ...
- 亚马逊开发者用户授权 AWS
在开发之前最好的方法是先拿到官网的API文档简单的预览一遍 这里有个中文文档:AWS 开发中文文档 需要准备: 注册成为开发者 创建 AWS 账户 创建 IAM 用户 创建 IAM 策略 创建 IAM ...
- 【CVE-2020-1948】Apache Dubbo Provider反序列化漏洞复现
一.实验简介 实验所属系列: 系统安全 实验对象:本科/专科信息安全专业 相关课程及专业: 计算机网络 实验时数(学分):2 学时 实验类别: 实践实验类 二.实验目的 Apache Dubbo是一款 ...
- Part 17 Consuming ASP NET Web Service in AngularJS using $http
Here is what we want to do1. Create an ASP.NET Web service. This web service retrieves the data from ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
- 美妙绝伦面向node引用-zico图标(逐浪矢量全真图标)1.9发布
15年前,那个农村小伙初入广告行业被讥笑没有审美 于是他狠下决心,积极研发,缔就技术之核, 再后来,那些PPT和美工er们随便怎么自好,无法让其心怵. 因为他是中华人民共和国唯一具备web.cms.o ...