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\}\) ...
随机推荐
- python中对列表的排序
1.sort()对列表永久性的排序,首字母按照字母表的顺序排列 book=['python','java','c++','web'] book.sort() print(book) 结果如下: 2.向 ...
- nsq - 一条消息的生命周期(一)
经过前面几篇的学习,相信大家对nsq已经有了一个大概的了解,我在写这篇文章的时候也看了很多其他人写的教程,发现大家对于分析系统每个点写的很不错,但是都很少有整体串起来一起走一遍,所以,我打算分成2-3 ...
- 浅析ReDoS的原理与实践
转载于http://www.freebuf.com/articles/network/124422.html ReDoS(Regular expression Denial of Service) 正 ...
- 第六次Scrum Metting
日期:2021年5月3日 会议主要内容概述:讨论前后端进度,前端各模块对接以及前后端对接. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 数据模块 ...
- Scrum Meeting 0429
零.说明 日期:2021-4-29 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分后端管理 ...
- 热身 for computer industry
项目 内容 作业属于 班级博客 作业要求 作业要求 个人课程目标 掌握软件工程基础知识 具体有助方面 个人认知与规划 其他参考文献 博客Ⅰ 博客 Ⅱ 选择计算机 你为什么选择计算机专业?你认为你的条件 ...
- docker multi-stage 多阶段构建
多阶段构建 一.需求 二.普通构建 1.编写Dockerfile 2.构建镜像 三.多阶段(multi-stage)构建 1.编写Dockerfile 2.构建镜像 四.比较2个镜像的体积大小 我们在 ...
- Noip模拟52 2021.9.13
T1 异或 比较稳的切掉 观察数据范围,无法线性筛啥的,根号复杂度也会死,于是只能考虑$log$级 然后打表 发现当$n$为$2^i$时的答案是一个可递归数列: $1,3,7,15,31,63,127 ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- STM32直流电机启动(一)驱动电路的介绍
驱动电路 典型的H桥驱动电路如下:要使电机旋转只需导通对角线上的两个三极管即可,如导通Q1,Q4,关闭Q2,Q4即可驱动电机正转:若想电机反向转动,即导通三极管Q2,Q3,关闭Q1,Q4.此时电路图可 ...