【UOJ#76】【UR #6】懒癌(动态规划)

题面

UOJ

题解

神....神仙题。

先考虑如果是完全图怎么做。。。

因为是完全图,所以是对称的,所以我们只考虑一个有懒癌的人的心路历程。

如果只有一只狗有懒癌:第一天,看了看,似乎其他的狗都没有,但是村子里至少有一只狗有,然后就确定了。

如果有两只狗:第一天,看了看,有一只别的狗有懒癌,不确定;第二天,昨天有懒癌的那只狗还活着,证明他不能确定,所以他还看到了别的狗有懒癌,而除了自己的未知和那个有懒癌的人,别的人的狗都没有懒癌,所以自己的狗有懒癌。

那么递归下去,似乎可以得到如果有\(k\)只狗有懒癌,那么在完全图的情况下就会在第\(k\)天同时开枪。

那么不难发现一切都是在这个人假装自己的狗没有病的前提下,如果他按时听到了枪声,那么他会认为自己的狗没病,否则没有按时听到枪声,他就会认为自己狗病了。那么这个枪声的时间是什么时候呢?显然这个人能够确定的是他所有能够看到的人的狗是否生病,其他的人任意情况都是可能的,那么设\(f[S]\)表示生病状态是开枪时间的最小值,那么这个人会枚举所有的情况,如果在\(max\{f[T]\}\)没有听到枪声,他就会在\(max\{f[T]\}+1\)时刻开枪。这样子直接暴力\(dp\)的复杂度大概是\(O(4^nn)\)左右?

这里打表可以发现当\(U\subset V\)时,\(f[U]\le f[V]\)。这样子就只需要把所有不能确定的全部默认为得了懒癌的,也就是全部看成\(1\)进行转移。

复杂度可以优化到\(O(2^nn)\)。

现在把时间给分开,一种是在有限时间内会开枪的,另外一个种是不会开枪的。考虑一下什么时候不会开枪,也就是一直无法确定的时候,最简单的例子就是只有两个人,他们互相看不见对方,那么永远都不知道时间。考虑构建出补图,即一个人如果看不到另外一个人就连一条边。那么一个不会开枪的情况在补图上表现为一个点数超过\(1\)的强连通分量。这是因为这些人之间的信息无法互相传递,导致信息不完整,所以永远都不会知道。

那么我们可以把这些\(SCC\)给删掉,剩下的部分显然就是一个\(DAG\)。

我们考虑把有懒癌的点给染黑,没有的染白。我们把上面的那个\(dp\)的模型给往这里靠。

这里的过程是:每次可以把一个黑点染白,然后把所有出边染黑。等到所有点都变白了之后,曾经被染黑过的点的个数就是答案。

那么我们回到上面的\(dp\),类比一下这个过程,每次找到一个黑点,一开始默认自己的白的,然后把所有看不到的给变成\(1\),这个过程就是上面的\(dp\)转移。而每次都是在上次的基础上\(+1\)。那么对于每个黑点都要转移出去一次,所以答案和上面的\(DAG\)上的模型一样。

那么我们把题目转化过来了,不难发现这个答案就是黑点点集能够访问到的点的个数。对于第一问考虑答案,显然每个点单独考虑,假设其能够到达这个点的点的个数为\(r\),那么贡献就是\((2^r-1)*2^{n-r}\)。

对于第二问而言,显然只有不存在别的黑点能够到达这个黑点的时候才会被统计,所以答案就是\(2^{n-r}\)。

那么拿\(bitset\)统计就行了。

#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
#define MOD 998244353
#define MAX 3030
int n,dg[MAX],bin[MAX],S[MAX],N;
bitset<MAX> a[MAX],g[MAX];
char s[MAX];
int main()
{
scanf("%d",&n);
bin[0]=1;for(int i=1;i<=n;++i)bin[i]=(bin[i-1]*2)%MOD;
for(int i=1;i<=n;++i)
{
scanf("%s",s+1);
for(int j=1;j<=n;++j)
if(i^j)g[i][j]=s[j]=='0',dg[i]+=g[i][j];
}
for(int i=1;i<=n;++i)if(!dg[i])S[++N]=i;
for(int i=1;i<=N;++i)
for(int j=1;j<=n;++j)
if(g[j][S[i]]&&!--dg[j])S[++N]=j;
for(int i=1;i<=N;++i)a[S[i]][S[i]]=1;
for(int i=N;i;--i)
for(int j=1;j<=n;++j)
if(g[S[i]][j])a[j]|=a[S[i]];
int ans1=0,ans2=0,r;
for(int i=1;i<=N;++i)
r=N-a[S[i]].count(),ans1=(ans1+1ll*(bin[N-r]-1)*bin[r])%MOD,ans2=(ans2+bin[r])%MOD;
printf("%d %d\n",ans1,ans2);
return 0;
}

【UOJ#76】【UR #6】懒癌(动态规划)的更多相关文章

  1. 【UOJ#246】套路(动态规划)

    [UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r- ...

  2. UOJ #76 -【UR #6】懒癌(思维题)

    UOJ 题面传送门 神仙题. orz czx,czxyyds 首先没有懒癌的狗肯定不会被枪毙,证明显然. 接下来考虑怎样计算一种局面的答案,假设 \(dp_S\) 表示对于有且仅有 \(S\) 中的狗 ...

  3. UOJ #76 【UR #6】懒癌

    确实是一道很不错的题啊. 题目链接 题意 感觉也没什么特别简洁的版本,大家直接看题面吧. 题解 我第一次看到这个类似问题的背景是疯狗,因此下面的题解不自觉的代入了...大家明白意思就好. 我们考虑对于 ...

  4. UOJ 【UR #5】怎样跑得更快

    [UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...

  5. NOIP 2016 换教室 (luogu 1850 & uoj 262) - 概率与期望 - 动态规划

    题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤ ...

  6. UOJ #22 UR #1 外星人

    LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...

  7. UOJ.52.[UR #4]元旦激光炮(交互 思路)

    题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...

  8. UOJ【UR #12】实验室外的攻防战

    题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...

  9. 【UOJ#50】【UR #3】链式反应(分治FFT,动态规划)

    [UOJ#50][UR #3]链式反应(分治FFT,动态规划) 题面 UOJ 题解 首先把题目意思捋一捋,大概就是有\(n\)个节点的一棵树,父亲的编号大于儿子. 满足一个点的儿子有\(2+c\)个, ...

随机推荐

  1. Spring Boot快速集成kaptcha生成验证码

    Kaptcha是一个非常实用的验证码生成工具,可以通过配置生成多样化的验证码,以图片的形式显示,从而无法进行复制粘贴:下面将详细介绍下Spring Boot快速集成kaptcha生成验证码的过程. 本 ...

  2. MVC过滤器:自定义授权过滤器

    一.授权过滤器 授权过滤器用于实现IAuthorizationFilter接口和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全策略.AuthorizeAttribute类继承了IAu ...

  3. go-控制语句

    if else else不能换行 if后最好不加小括号,当然可以加,但建议不加 求平方根 引入math包 调用math.Sqrt(num)函数 switch分支 不用加break来跳出,每一个case ...

  4. DevExpress的下拉框控件ComboxBoxEdit怎样绑定键值对选项

    场景 DevExpress的下拉框控件ComboBoxEdit控件的使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1028 ...

  5. 六个office免费学习的精品教程 office自学教程让你从小白到高手

    今天给大家分享六个免费学习的精品教程,包括了word,ppt,excel常用的办公三剑客,学会这三个让你办公无忧,也能让你靠这些技术找到一份好工作,这些office自学教程让你从小白到高手. 一.PP ...

  6. 安全类和远程类shell脚本

    批量杀php小马脚本 find /home/hatdot/ -name "*.php" |xargs egrep "phpspy|c99sh|milw0rm|eval\( ...

  7. Vysor

    官网:http://www.vysor.io/ Vysor用 PC远程控制投影安卓手机/平板工具 Vysor 是一个免费的google浏览器插件. 它可以让你在pc上控制你的Android手机.平板等 ...

  8. 1. Git初始

    一.Git初始 1. 定义 ​ 分布式的版本控制系统,在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用Git.当然为了习惯及团队协作,会将本地数据同步到Git服务器或者GitHub等代码 ...

  9. ACM-ICPC 2018 焦作网络赛

    题目顺序:A F G H I K L 做题链接 A. Magic Mirror 题意:判断 给出的 字符串 是否等于"jessie",需要判断大小写 题解:1.用stl库 tolo ...

  10. 汇编和C/C++的混合编程方式

    常用的有三种方式: 在C/C++代码中嵌入汇编指令 汇编调用C/C++ C/C++中调用汇编 实例一: 在C中嵌入汇编: void string_copy(char *dst,const char * ...