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. dubbo注册中心占位符无法解析问题(二)

    dubbo注册中心占位符无法解析问题 前面分析了dubbo注册中心占位符无法解析的问题. 并给出了2种解决办法: 降低mybatis-spring的版本至2.0.1及以下 自定义MapperScann ...

  2. javascript-jquery对象的其他处理

    一.对元素进行遍历操作 如果要遍历一个jquery对象,对其中每个匹配元素进行相应处理,那么可以使用each()方法. $("div").each(function(index,e ...

  3. [Git系列] Git 基本概念

    版本控制系统 版本控制系统是一种帮助软件开发者实现团队合作和历史版本维护的软件,一个版本控制系统应具备以下列出的这几个基本功能: 允许开发者并发工作: 不允许一个开发者覆写另一个开发者的修改: 保存所 ...

  4. 通过简单例子 | 快速理清 UML 中类与类的六大关系

    关于封面:我想我们都会离开 类与类之间的六大关系 泛化 ( Generalization ) ---> 表继承关系 实现 ( Realization ) 关联 ( Association ) 聚 ...

  5. Java:包装类小记

    Java:包装类 对 Java 中的 包装类 这个概念,做一个微不足道的小小小小记 基本数据&包装类 四类八种基本数据类型: 数据类型 关键字 内存占用 取值范围 字节型 byte 1个字节 ...

  6. Machine learning (6-Logistic Regression)

    1.Classification However, 2.Hypothesis Representation Python code: import numpy as np def sigmoid(z) ...

  7. hdu 1158 Employment Planning(DP)

    题意: 有一个工程需要N个月才能完成.(n<=12) 给出雇佣一个工人的费用.每个工人每个月的工资.解雇一个工人的费用. 然后给出N个月所需的最少工人人数. 问完成这个项目最少需要花多少钱. 思 ...

  8. Can't open PID file /run/zabbix/zabbix_agentd.pid

    神奇的事情,重启主机(reboot)后查看状态是正常的没有报错,重启zabbix-agent后,报无法打开zabbix_agentd.pid,zabbix-web正常监控 1.首先,/etc/zabb ...

  9. Linux系统编程之进程控制(进程创建、终止、等待及替换)

    进程创建 在上一节讲解进程概念时,我们提到fork函数是从已经存在的进程中创建一个新进程.那么,系统是如何创建一个新进程的呢?这就需要我们更深入的剖析fork函数. 1.1 fork函数的返回值 调用 ...

  10. 启用或禁用普通用户Exchange Online PowerShell功能

    默认情况下,允许在 Microsoft 365 中创建的所有帐户都可以使用 Exchange Online PowerShell.管理员可以使用 Exchange Online PowerShell ...