【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

时间:2022-08-26 21:27:37

【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

题面

UOJ

题解

毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ

一开始开错题了,根本就不会做。

后来发现是每次任意覆盖相邻的两个,那么很明显就可以套\(min-max\)容斥。

要求的就是\(max(All)\),而每个集合的\(min\)是很好求的。

如果直接暴力枚举集合复杂度就是\(2^{cnt}cnt\)。

仔细想想每个子集我们要知道的是什么,只需要知道子集大小来确定前面的容斥系数,还需要知道覆盖子集的方案数,这样就可以知道\(min\)的概率,倒数就是期望了。

而覆盖子集的方案数不会超过\(2*n*m-n-m\),显然要比\(2^{cnt}\)优秀。

所以枚举覆盖子集的方案数来\(dp\),至于子集大小之和容斥系数相关,而容斥系数只有正负\(1\),所以直接乘进去一起转移就好了,不需要单独存一维状态。

考虑每次新加入一个点之后的覆盖方案,只需要知道当前位置四周是否已经存在于子集当中,那么直接状压当前的轮廓线就好了。

设状态\(f[S][k]\)表示覆盖方案数为\(k\),轮廓线为\(S\)时的方案数,容斥系数已经考虑进去。

显然当前位置可以不选,那么直接转移。

如果当前位置可以选入子集,那么乘上系数\(-1\),同时修改覆盖方案数以及轮廓线的状态转移。

最后按照\(min-max\)容斥统计答案即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 998244353
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
char g[200][200];
int n,m,inv[1500],sum,pw,nw,ans,S;
int f[2][1<<6][1200];
int main()
{
scanf("%d%d",&n,&m);S=1<<n;sum=2*n*m-n-m;
for(int i=1;i<=n;++i)scanf("%s",g[i]+1);
inv[0]=inv[1]=1;for(int i=2;i<1500;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
f[0][0][0]=MOD-1;
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
{
pw=nw;nw^=1;memset(f[nw],0,sizeof(f[nw]));
for(int T=0;T<S;++T)
for(int k=0;k<=sum;++k)
if(f[pw][T][k])
{
int nT=T&((S-1)^(1<<(j-1)));
add(f[nw][nT][k],f[pw][T][k]);
if(g[j][i]=='*')
{
nT|=1<<(j-1);int pls=0;
if(j>1&&!(T&(1<<(j-2))))++pls;
if(i>1&&!(T&(1<<(j-1))))++pls;
if(i<m)++pls;if(j<n)++pls;
add(f[nw][nT][k+pls],MOD-f[pw][T][k]);
}
}
}
for(int T=0;T<S;++T)
for(int i=1;i<=sum;++i)
add(ans,1ll*f[nw][T][i]*inv[i]%MOD);
ans=1ll*ans*sum%MOD;printf("%d\n",ans);
return 0;
}

【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)的更多相关文章

  1. UOJ 422 &lbrack;集训队作业2018&rsqb; 小Z的礼物 min-max容斥 期望 轮廓线dp

    LINK:小Z的礼物 太精髓了 我重学了一遍min-max容斥 重写了一遍按位或才写这道题的. 还是期望多少时间可以全部集齐. 相当于求出 \(E(max(S))\)表示最后一个出现的期望时间. 根据 ...

  2. UOJ 422 - 【集训队作业2018】小Z的礼物(Min-Max 容斥&plus;轮廓线 dp)

    题面传送门 本来说要找道轮廓线 \(dp\) 的题目刷刷来着的?然后就找到了这道题. 然鹅这个题给我最大的启发反而不在轮廓线 \(dp\),而在于让我新学会了一个玩意儿叫做 Min-Max 容斥. M ...

  3. &lbrack;UOJ422&rsqb;&lbrack;集训队作业2018&rsqb;小Z的礼物——轮廓线DP&plus;min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  4. uoj&num;422&period; 【集训队作业2018】小Z的礼物(MIn-Max容斥&plus;插头dp)

    题面 传送门 题解 好迷-- 很明显它让我们求的是\(Max(S)\),我们用\(Min-Max\)容斥,因为\(Min(S)\)是很好求的,只要用方案数除以总方案数算出概率,再求出倒数就是期望了 然 ...

  5. UOJ 449 【集训队作业2018】喂鸽子 【生成函数&comma;min-max容斥】

    这是第100篇博客,所以肯定是要水过去的. 首先看到这种形式的东西首先min-max容斥一波,设\(f_{c,s}\)表示在\(c\)只咕咕中,经过\(s\)秒之后并没有喂饱任何一只的概率. \[ \ ...

  6. &lbrack;集训队作业2018&rsqb;蜀道难——TopTree&plus;贪心&plus;树链剖分&plus;链分治&plus;树形DP

    题目链接: [集训队作业2018]蜀道难 题目大意:给出一棵$n$个节点的树,要求给每个点赋一个$1\sim n$之内的权值使所有点的权值是$1\sim n$的一个排列,定义一条边的权值为两端点权值差 ...

  7. uoj &num;450&lbrack;集训队作业2018&rsqb;复读机

    传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...

  8. UOJ&num;422&period; 【集训队作业2018】小Z的礼物

    #422. [集训队作业2018]小Z的礼物 min-max容斥 转化为每个集合最早被染色的期望时间 如果有x个选择可以染色,那么期望时间就是((n-1)*m+(m-1)*n))/x 但是x会变,中途 ...

  9. 2019&period;2&period;25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

随机推荐

  1. sql中limit使用方法

    此处以mysql为例,但是我相信物以变通在oracle上也一定适用 下面是几种limit的方法:原则看看下面几个例子应该就懂了 在数据库中很多地方都会用到,比如当你数据库查询记录有几万.几十万时使用l ...

  2. mysql 已有数据字符集的修改

    mysql 字符集的修改 可以使用set names utf8 通过修改配置文件 可修改参数 default_character_set=utf8 但是以上修改方法只对数据库中新增的记录生效,如果数据 ...

  3. MySQL 分区表

    转载自MySQL 分区表 今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看, ...

  4. atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结

    atitit.浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结 1. 缓存的一些机制 1 1.1. http 304 1 1.2. 浏览器刷新的处理机制 1 1.3. Expir ...

  5. JSP简单练习-数组应用实例

    <%@ page contentType="text/html; charset=gb2312" %> <html> <body> <% ...

  6. sql还原&lpar;&period;sql文件还原&rpar;

    第一步: 把还原文件直接拖到SQL Server 2012(或者其他版本)里面,这里以MyDB.sql为例

  7. 单细胞文献分析 Quantitative single-cell rna-seq with unique molecular identifers

    Quantitative single-cell rna-seq with unique molecular identifers 这篇文章论证了 scRNA-seq 使用UMI来计算基因表达量的合理 ...

  8. 20165228 2017-2018-2 《Java程序设计》第6周学习总结

    20165228 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 String类用来处理字符序列及其用法 StringTokenizer对象及类的使用 Sca ...

  9. java--多线程编程简介

    1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...

  10. &lpar;oralce&rpar;pga&lowbar;aggregate&lowbar;target与workarea&lowbar;size&lowbar;policy相互关系验证

    pga_aggregate_target与workarea_size_policy相互关系验证 先放上结论: 1. 当pga_aggregate_target设置为非0, 手工设置(workarea ...