UOJ#422 小Z的礼物



非常神奇的一个套路......首先min-max容斥一波,变成枚举子集然后求所有子集min的期望。
一个子集的期望怎么求?我们可以求出所有的r = 2nm - n - m个选法中能够选到这个子集的方案数k,那么概率就是k / r,则期望是r / k。
发现子集数量上天了......但是这个方案数k十分之小。
于是我们非常神奇的转换思路。
求出对于每个k,有多少个子集满足恰有k种选法能够选到。
这样我们就能够把k当成一维状态,进行状压DP。压轮廓线上的点是否选入子集,一格一格转移。
每种选法在右边/下边的格子统计。每次枚举当前这格选不选,然后观察方案数是否增加。
如果选了一个格子,集合数量改变,要乘一个-1作为系数。
#include <bits/stdc++.h> typedef long long LL;
const int N = , MO = ; int G[N][N], n, m, f[][][], inv[];
char str[N]; inline void add(int &a, const int &b) {
a = a + b;
while(a >= MO) a -= MO;
while(a < ) a += MO;
return;
} inline void out(int x) {
for(int i = ; i < m; i++) printf("%d", (x >> i) & );
return;
} int main() { scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%s", str + );
for(int j = ; j <= m; j++) {
G[j][i] = (str[j] == '*');
}
}
std::swap(n, m); /// input over int lm = ( << m), up = * n * m - n - m;
f[][][] = -;
for(int i = ; i <= n; i++) {
for(int j = ; j < m; j++) {
/// pos (i, j)
int p = (i - ) * m + j; for(int w = ; w <= up; w++) {
for(int s = ; s < lm; s++) {
f[(p + ) & ][w][s] = ;
}
} for(int w = ; w <= up; w++) {
for(int s = ; s < lm; s++) {
if(!f[p & ][w][s]) continue;
//printf("f (%d %d) w=%d ", i, j, w); out(s); printf(" = %d \n", f[p][w][s]);
int c = f[p & ][w][s], temp = ;
if(j) temp += (s >> (j - )) & ;
if(i > ) temp += (s >> j) & ;
add(f[(p + ) & ][w + temp][s & (~( << j))], c); /// not choose
if(G[i][j + ]) {
add(f[(p + ) & ][w + (i > ) + (j > )][s | ( << j)], -c); /// choose
}
}
}
}
}
//printf("\n");
inv[] = inv[] = ;
for(int i = ; i <= up; i++) {
inv[i] = 1ll * inv[MO % i] * (MO - MO / i) % MO;
}
int ans = , p = n * m;
for(int w = ; w <= up; w++) {
for(int s = ; s < lm; s++) {
add(ans, 1ll * f[p & ][w][s] * inv[w] % MO * up % MO);
//printf("ed : w=%d ", w); out(s); printf(" = %d \n", f[p][w][s]);
}
}
printf("%d\n", ans);
return ;
}
AC代码
[update]注意到这个DP数组中的那个s维,一定是“*”的子集。否则不会转移,为0,没有意义。
not choose那个转移表示当前不是*或者不选,当前这里覆盖上面那个*或左边那个*。
choose表示这里是*且加入集合,有两种摆法覆盖它,同时多了一个*导致要乘一个-1。
UOJ#422 小Z的礼物的更多相关文章
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
- UOJ#422. 【集训队作业2018】小Z的礼物
#422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...
- 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 ...
- 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物
T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...
- uoj#422. 【集训队作业2018】小Z的礼物(MIn-Max容斥+插头dp)
题面 传送门 题解 好迷-- 很明显它让我们求的是\(Max(S)\),我们用\(Min-Max\)容斥,因为\(Min(S)\)是很好求的,只要用方案数除以总方案数算出概率,再求出倒数就是期望了 然 ...
- UOJ 422 - 【集训队作业2018】小Z的礼物(Min-Max 容斥+轮廓线 dp)
题面传送门 本来说要找道轮廓线 \(dp\) 的题目刷刷来着的?然后就找到了这道题. 然鹅这个题给我最大的启发反而不在轮廓线 \(dp\),而在于让我新学会了一个玩意儿叫做 Min-Max 容斥. M ...
- UOJ422. 【集训队作业2018】小Z的礼物 [min-max容斥,插头DP]
UOJ 思路 由于没有代码和AC记录的支撑,以下思路可能有错. 看到全部取完,大概可以想到min-max容斥. 由于期望的表达式里面合法方案的个数是在分母里面的,所以可以想到把它记录在状态里. 然而由 ...
- 【集训队作业2018】小Z的礼物
小水题.题意就是不断随机放一个 \(1 \times 2\) 骨牌,然后取走里面的东西.求期望多少次取走所有的东西.然后有一维很小. 首先显然 minmax 容斥,将最后取走转化为钦定一些物品,求第一 ...
随机推荐
- 布局管理器之BorderLayout(边界布局)
边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次对应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENT ...
- 重写TreeView模板来实现数据分层展示(一)
总想花些时间来好好总结一下TreeView这个WPF控件,今天来通过下面的这几个例子来好好总结一下这个控件,首先来看看一个常规的带虚线的TreeView控件吧,在介绍具体如何完成之前首先来看看最终实现 ...
- Java多线程3:Thread中的实例方法
一.Thread类中的方法调用方式 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: ...
- 三、zookeeper安装
一.简介 二.下载解压: #wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar ...
- Lodop打印控件指定打印任务某几页
使用Lodop打印控件进行打印开发,有时候一个任务里有多页,例如各种合同之类的,客户端用户在使用过程中,可能有某一页打印后发现需要修改,这时候不必再把整个任务重新打印一遍,只需要打印需要修改的那页重新 ...
- hdu-5687(字典树)
题意:中文题: 解题思路:增加和查询就不说了,标准操作,就是删除操作:删除操作的时候,我们把给定字符串先在字典树中遍历一遍,然后算出这个字符串最后一个字符的出现次数,然后在遍历一遍,每个节点都减去这个 ...
- sql练习题及经典题
https://blog.csdn.net/mrbcy/article/details/68965271 经典例题 19.查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录. S ...
- BZOJ2738 矩阵乘法(整体二分+树状数组)
单个询问二分答案即可,多组询问直接整体二分再二维BIT.注意保证复杂度. #include<iostream> #include<cstdio> #include<cma ...
- subprocess 模块
import subprocess # 就用来执行系统命令 import os cmd = r'dir D:\上海python全栈4期\day23 | findstr "py"' ...
- pfSense用户界面汉化翻译教程
pfSense用户界面汉化翻译教程 来源 https://blog.51cto.com/fxn2025/2087182 为了记录自己的汉化过程,同时也为了方便网友自己制作汉化版本,我把自己汉化pfSe ...