UOJ 题面传送门

神仙题。

orz czx,czxyyds

首先没有懒癌的狗肯定不会被枪毙,证明显然。

接下来考虑怎样计算一种局面的答案,假设 \(dp_S\) 表示对于有且仅有 \(S\) 中的狗得了懒癌的情况,最少需要多少天才能有狗被枪毙。显然如果 \(|S|=1\),那么 \(dp_S=1\),因为得了懒癌的狗的主人一天就可以知道自己的狗得了懒癌。对于其他情况,我们不妨从一个得了懒癌的狗的情况思考这个问题,假设为狗 \(x\) 的主人,\(x\in S\),那么他会先假设自己的狗没有得懒癌,自己看不见的狗得懒癌的情况为任何一种,设为 \(S'\),其中 \(S'\) 与 \(S\) 满足状态不同的元素都是 \(x\) 不能看见的狗的编号的集合,那么我们考察 \(\max\{dp_{S'}\}\),如果过了 \(\max\{dp_{S'}\}\) 天还没听到枪声,那说明所有 \(S'\) 都不可能是得了懒癌得狗得集合,这时候狗 \(x\) 的主人便会知道自己的狗一定得了懒癌,于是,砰,游戏到此结束。而游戏结束的时间,肯定是对于所有得了懒癌的狗的主人,他们反应过来自己的狗得了懒癌的时间的 \(\min\),因此 \(dp_S=\min_{x}\{\max\{dp_{S'}\}\}+1\)

从上面的转移中我们可以看出对于 \(S\subseteq T\),都有 \(dp_S\le dp_T\),也就是说,上面的 \(dp_{S'}\) 取到 \(\max\) 的情况,就是我们把所有 \(x\) 不能看到的狗都插入集合 \(S\) 并从集合 \(S\) 中删除 \(x\) 得到的集合。因此我们考虑将上面的暴力枚举 \(S'\) 的过程修改为:首先对于两条狗 \(i,j\),如果 \(i\) 看不到 \(j\) 则连一条 \(i\to j\) 的有向边,那么我们每次选择一个 \(S\) 中的元素并将其删除,同时将所有与其有直接边相连的元素插入 \(S\),如此进行下去直到 \(S\) 为空,那么这个最小步数就是 \(S\) 的答案。

注意到如果一个点在一个环上或者能到达一个环,那么如果该元素在 \(S\) 中,那么过程一定无法结束,因此这样的点一定不能出现在 \(S\) 中,因此考虑在反图上进行一遍拓扑排序,这样即可知道哪些点必须不能在 \(S\) 中,我们设剩余的点数为 \(m\)。

最后思考如何求解答案。对于这样的题,我们肯定要思考对于一个点,它会对哪些集合的第一问或者第二问的答案产生贡献,不难发现,对于第一问而言,答案就是 \(S\) 中所有点能到达的点的并的大小,也就是说,一个点的贡献会被统计入答案,当且仅当所有能够到达它的点中,至少有一个点属于 \(S\),因此我们先一遍 bitset 对每个点求出,有多少点能到达它,设为 \(c_i\),那么一个点的贡献就是 \((2^{c_i}-1)2^{m-c_i}\)。对于第二问而言,通过上面的过程也可以发现,被枪毙的狗都是集合中没有其他狗能够到达的狗,因此一个点的贡献自然是 \(2^{m-c_i}\),累加求和即可。

时间复杂度 \(\dfrac{n^3}{\omega}\),由于常数小,1s 时限绰绰有余。

const int MAXN=3000;
const int MOD=998244353;
int n,a[MAXN+5][MAXN+5],deg[MAXN+5],vis[MAXN+5],pw[MAXN+5];
bitset<MAXN+5> rch[MAXN+5];
int main(){
// freopen("island.in","r",stdin);
// freopen("island.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
static char s[MAXN+5];scanf("%s",s+1);
for(int j=1;j<=n;j++) a[i][j]=s[j]-'0';
}
for(int i=1;i<=n;i++) a[i][i]=1;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(!a[i][j]) ++deg[i];
queue<int> q;for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);
vector<int> seq;
while(!q.empty()){
int x=q.front();q.pop();vis[x]=1;seq.pb(x);
for(int i=1;i<=n;i++) if(!a[i][x]){
if(!--deg[i]) q.push(i);
}
}
for(int i=1;i<=n;i++) if(vis[i]) rch[i].set(i);
reverse(seq.begin(),seq.end());
for(int i=0;i<seq.size();i++){
int x=seq[i];
for(int j=1;j<=n;j++) if(!a[x][j]&&vis[j]) rch[j]|=rch[x];
}
for(int i=(pw[0]=1);i<=MAXN;i++) pw[i]=(pw[i-1]<<1)%MOD;
int res1=0,res2=0,tot=seq.size();
for(int i=1;i<=n;i++) if(vis[i]){
int cnt=rch[i].count();
// printf("%d %d\n",i,cnt);
res1=(res1+1ll*(pw[cnt]-1+MOD)*pw[tot-cnt])%MOD;
res2=(res2+pw[tot-cnt])%MOD;
} printf("%d %d\n",res1,res2);
return 0;
}

UOJ #76 -【UR #6】懒癌(思维题)的更多相关文章

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

    [UOJ#76][UR #6]懒癌(动态规划) 题面 UOJ 题解 神....神仙题. 先考虑如果是完全图怎么做... 因为是完全图,所以是对称的,所以我们只考虑一个有懒癌的人的心路历程. 如果只有一 ...

  2. 【UOJ#82】【UR #7】水题生成器(贪心)

    [UOJ#82][UR #7]水题生成器(贪心) 题面 UOJ 题解 把\(n!\)的所有约数搜出来,这个个数不会很多. 然后从大往小能选则选就好了. #include<iostream> ...

  3. zoj 3778 Talented Chef(思维题)

    题目 题意:一个人可以在一分钟同时进行m道菜的一个步骤,共有n道菜,每道菜各有xi个步骤,求做完的最短时间. 思路:一道很水的思维题, 根本不需要去 考虑模拟过程 以及先做那道菜(比赛的时候就是这么考 ...

  4. cf A. Inna and Pink Pony(思维题)

    题目:http://codeforces.com/contest/374/problem/A 题意:求到达边界的最小步数.. 刚开始以为是 bfs,不过数据10^6太大了,肯定不是... 一个思维题, ...

  5. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  6. 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)

    思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...

  7. C. Nice Garland Codeforces Round #535 (Div. 3) 思维题

    C. Nice Garland time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  8. PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记

    PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...

  9. UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)

    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...

  10. HDU 1029 Ignatius and the Princess IV / HYSBZ(BZOJ) 2456 mode(思维题,~~排序?~~)

    HDU 1029 Ignatius and the Princess IV (思维题,排序?) Description "OK, you are not too bad, em... But ...

随机推荐

  1. pg_basebackup报错: pg_basebackup: incompatible server version 12.4

    pg_basebackup报错 今日从库复制主库data时,发现pg_basebackup无法使用,详情如下: 错误为:incompatible server version 12.4 [postgr ...

  2. 【c++ Prime 学习笔记】第18章 用于大型程序的工具

    大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理 ...

  3. OO助教工作总结

    ​ \(OO\)助教的工作结束了,在这一学期中,我主要负责对作业进行测试,对指导书进行检查,讨论区管理,部分数据构造,以及完成随班助教的工作. 测试 指导书检查 ​ 每次指导书公开前我都会先把指导书看 ...

  4. stm32串口学习笔记

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  5. reactnative实现qq聊天消息气泡拖拽消失效果

    前言(可跳过) 我在开发自己的APP时遇到了一个类似于qq聊天消息气泡拖拽消息的需求,因为在网上没有找到相关的组件,所以自己动手实现了一下 需求:对聊天消息气泡拖拽到一定长度松开时该气泡会消失(可自行 ...

  6. vcs(UST)Undefined System Task Call

    转载:VCS求助啊 - 微波EDA网 (mweda.com) Error-[UST] Undefined System Task Call../../path/bench/path.v, 51Unde ...

  7. songwenxin

    # -*- coding: utf-8 -*- import wx from modelmngr_frame import MyFrame1 ############################# ...

  8. cf13A Numbers(,,)

    题意: Little Petya likes numbers a lot. He found that number 123 in base 16 consists of two digits: th ...

  9. 一、安装zabbix监控(源码编方式)

    首先介绍一下zabbix的运行原理和运行条件. Zabbix监控原理 Zabbix 通过C/S 模式采集数据,通过B/S模式在web 端展示和配置.  被监控端:主机通过安装agent 方式采集数据, ...

  10. 2016-12-01,我的CSDN有排名啦!

    等了好久终于等到今天,梦了好久终于把梦实现----[捂脸] 从2015-08-03发表第一篇博客以来,这里就成了我记录技术成长点滴,学习过程,总结备忘的地方,虽然中间自己也在腾讯云上搭过自己的博客,但 ...