[uoj76]懒癌
为了方便,称患有懒癌的狗为"坏狗"
记$Q_{i}$为第$i$个人能观察的狗集合,$S$为坏狗集合,那么第$k$天第$i$个人能得到的信息有且仅有$S\ne \empty$、$S\cap Q_{i}$、前$k-1$天没有开枪,而如果不存在$S_{0}$具有相同的信息且$i\not\in S_{0}$,那么其就会开枪
由此,令$T$为当前(第$k$天)仍未开枪的坏狗集合(的集合),初始$k=0$且$T$为全非空集,那么将$k$增加1后第$i$个人会在$S\in T$的状态下开枪当且仅当不存在$S_{0}\in T$满足$S\cap Q_{i}=S_{0}\cap Q_{i}$且$i\not\in S_{0}$
(特别的,若$i\not\in S$时一定不会开枪,因为取$S_{0}=S$即可)
由此暴力模拟,每一次判定复杂度为$o(n4^{n})$,并且若某次$T$不变显然之后也不会变,因此天数不超过$o(2^{n})$,总复杂度为$o(n8^{n})$
性质:(任意时刻)若$S\in T$,则$\forall S\subseteq S_{0},S_{0}\in T$
初始显然成立(仅有$\empty\not\in T$)
假设某个时刻第$i$个人在$S$的状态下开枪,即要将$S$在$T$中删除,归纳此性质即需要保证$\forall S'\subseteq S,S'\not\in T$(在该时刻之前已经被删除)或也在本次被删除
假设$S'\in T$且也未在本次被删除,即存在$S_{0}'\in T$满足$S'\cap Q_{i}=S'_{0}\cap Q_{i}$且$i\not\in S'$,进而可以根据归纳构造$S_{0}=S'_{0}\cup (S-S')\in T$,那么由于$S_{0}$显然第$i$个人同样不会在$S$的状态下开枪,矛盾
由此,第$i$个人会在$S$的状态下开枪当且仅当$S_{0}=(S\cup (U-Q_{i}))-\{i\}\not\in T$(其中$U$为全集),那么判定复杂度降为$o(n2^{n})$,总复杂度为$o(n4^{n})$
进一步的,对所有状态建图,从$(S\cup (U-Q_{i}))-\{i\}$向$S$连一条边,那么即求从$\empty$到$S$的最短路和(取到最短路时)最后一条边的方案数,直接bfs即可,总复杂度为$o(n2^{n})$
建立原来有向图的反图(即$i$到$j$有边当且仅当$j\ne i$且$j\not\in Q_{i}$),并将状态用染色来描述(将坏狗染为黑色,其余点为白色),那么$(S\cup (U-Q_{i}))-i$即将$i$变为白色、反图中$i$所到达的点变为黑色,而问题也即求这样最少要操作多少次能使得所有点均为白色和(取到最小值时)第一步的方案数
注意到只有操作的点会变为白色,那么若一个点存在一条以其为起点且任意长的路径:要使其变为白色一定要操作其而使得该路径上下个点为黑色,要使下个点变为白色一定要操作下个点而使得该路径上下下个点为黑色……最终显然无法使得所有点均为白色
不妨将这类点删除(递归判定即可),最终得到的即是一张DAG
而这个DAG上,操作次数的最小值显然即有多少个点存在一个黑点能到达其(包括自己),第一步的方案数即有多少个点满足其本身为黑点且不存在其他黑点能到达其
对每一个点去统计贡献,假设有$x$个点能到达其,那么其对两者的贡献即分别为$(2^{x}-1)2^{n-x}$和$2^{n-x}$
关于上述过程的实现,即是要维护连通性,用floyd+bitset即可
时间复杂度为$o(\frac{n^{3}}{\omega})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 3005
4 #define mod 998244353
5 #define ll long long
6 bitset<N>f[N];
7 int n,n0,ans1,ans2,mi[N],vis[N];
8 char s[N];
9 int main(){
10 mi[0]=1;
11 for(int i=1;i<N;i++)mi[i]=2*mi[i-1]%mod;
12 scanf("%d",&n);
13 for(int i=1;i<=n;i++){
14 scanf("%s",s+1);
15 for(int j=1;j<=n;j++)
16 if ((i!=j)&&(s[j]=='0'))f[i][j]=1;
17 }
18 for(int k=1;k<=n;k++)
19 for(int i=1;i<=n;i++)
20 if (f[i][k])f[i]|=f[k];
21 for(int i=1;i<=n;i++)
22 if (!f[i][i])vis[i]=1;
23 for(int i=1;i<=n;i++)
24 for(int j=1;j<=n;j++)
25 if ((!vis[j])&&(f[i][j]))vis[i]=0;
26 for(int i=1;i<=n;i++)
27 if (vis[i])n0++;
28 for(int i=1;i<=n;i++)
29 if (vis[i]){
30 int cnt=1;
31 for(int j=1;j<=n;j++)
32 if ((vis[j])&&(f[j][i]))cnt++;
33 ans1=(ans1+(ll)(mi[cnt]-1)*mi[n0-cnt])%mod;
34 ans2=(ans2+mi[n0-cnt])%mod;
35 }
36 printf("%d %d\n",ans1,ans2);
37 return 0;
38 }
[uoj76]懒癌的更多相关文章
- 【UR #6】懒癌
		
Problem Description 你绞尽脑汁也没有解开智商锁给的迷题,只见哐地一下门就开了:"您与锁的主人智商一致." 于是你们窃取了大量内部资料,最后端掉了 \(IIIS\ ...
 - 【UOJ#76】【UR #6】懒癌(动态规划)
		
[UOJ#76][UR #6]懒癌(动态规划) 题面 UOJ 题解 神....神仙题. 先考虑如果是完全图怎么做... 因为是完全图,所以是对称的,所以我们只考虑一个有懒癌的人的心路历程. 如果只有一 ...
 - 「UR#6」懒癌
		
「UR#6」懒癌 妈妈我居然看了六个小时题解,快救救乌干达的可怜儿童吧. 接下来开始膜官方题解:  其实就算有上面两个结论也不是很好想到任意复杂度的做法,关键在于要想到一个人是怎么推断自己的狗是不是 ...
 - UOJ #76 -【UR #6】懒癌(思维题)
		
UOJ 题面传送门 神仙题. orz czx,czxyyds 首先没有懒癌的狗肯定不会被枪毙,证明显然. 接下来考虑怎样计算一种局面的答案,假设 \(dp_S\) 表示对于有且仅有 \(S\) 中的狗 ...
 - UOJ #76 【UR #6】懒癌
		
确实是一道很不错的题啊. 题目链接 题意 感觉也没什么特别简洁的版本,大家直接看题面吧. 题解 我第一次看到这个类似问题的背景是疯狗,因此下面的题解不自觉的代入了...大家明白意思就好. 我们考虑对于 ...
 - 懒癌晚期学图论的时候自己用C语言写了个求可达性矩阵的算法~
		
可达性矩阵算法~ 直接上代码 #include <iostream> #include <cstring> using namespace std; #define n 5 v ...
 - Hello bokeyuan!
		
一个学习技术的年轻人 从2016/09/03进入大学学习计算机科学与技术这门学科,我已经学习了4个月了,大学的生活很枯燥,很麻烦,很多事,与我想象中的大学有很大的区别.但是这都不会影响我想要成为一个技 ...
 - HTML5 摇一摇加强版之一次失败的探索
		
最近在看设备传感器的API,当然也少不了研究一下让微信称神的“摇一摇”了.关于“摇一摇”的实现,网上很多资料所以不详细说了,但总是有布局.效果不全等各种问题,所以作为一名资深copypaster,代码 ...
 - 淘宝UWP中的100个为什么
		
从淘宝UWP第一版发布到现在,已经有十个月了,期间收到了用户各种各样的反馈,感谢这些用户的反馈,指导我们不断的修正.完善应用.但是也有一部分需求或建议,由于资源或技术的限制,目前确实无法做到,只能对广 ...
 
随机推荐
- Sentry 监控 - Snuba 数据中台架构(Query Processing 简介)
			
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
 - 试题 历届试题 翻硬币 java题解
			
问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...
 - Netty-FastThreadLocal快在哪里呢?
			
来源于:https://www.wangdaye.net/archives/n-e-t-t-y-zhi-f-a-s-t-t-h-r-e-a-d-l-o-c-a-l 前言 netty的concurren ...
 - vps实现私人代码托管并用nginx部署hexo
			
个人博客 原本我的博客是通过github pages搭建的,但由于一些众所周知的原因,即使套上了CDN依旧是访问状态令人堪忧,经常会造成各种各样的问题,并且由于不存在服务器也不好进行进一步的管理,更不 ...
 - (半课内)信安数基 RSA-OAEP 初探
			
在RSA攻击中,存在着"小明文攻击"的方式: 在明文够小时,密文也够小,直接开e次方即可: 在明文有点小时,如果e也较小,可用pow(m,e)=n*k+c穷举k尝试爆破 所以,比如 ...
 - 【Python从入门到精通】(二)怎么运行Python呢?有哪些好的开发工具(PyCharm)
			
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 这是Pyhon系列文章的第二篇,本文主要介绍如何运行Python程序以及安装PyCharm开发工具. 干货满满,建议收藏,需要用到时常看看. 小伙 ...
 - Go语言核心36讲(Go语言进阶技术七)--学习笔记
			
13 | 结构体及其方法的使用法门 我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结 ...
 - [对对子队]Beta阶段项目展示博客
			
Beta阶段项目展示博客 1 团队成员的简介和个人博客地址 成员 头像 岗位 博客 个人介绍 黄贤昊 PM 17373253 喜欢玩游戏和做游戏,项目经验基本都和游戏相关,擅长摸鱼,偶尔敬业. 吴桐雨 ...
 - Spring Security Jwt Token 自动刷新
			
token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...
 - 基于websocket实现的一个简单的聊天室
			
本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...