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. NX二次开发 克隆

    NXOpen.UF.UFSession theUfSession = NXOpen.UF.UFSession.GetUFSession(); try { //初始化 NXOpen.UF.UFClone ...

  2. python爬虫时,解决编码方式问题的万能钥匙(uicode,utf8,gbk......)

    转载   原文:https://blog.csdn.net/xiongzaiabc/article/details/81008330 无论遇到的网页代码是何种编码方式,都可以用以下方法统一解决 imp ...

  3. 【UE4 C++】 UDataAsset、UPrimaryDataAsset 的简单使用

    UDataAsset 简介 用来存储数据,每一个DataAsset 都是一份数据 可以派生,系统自带派生 UPrimaryDataAsset 方便数据对象的加载和释放 可以引用其他的 UDataAss ...

  4. 异常大讨论-抛出异常还是返回false

    iteye精华帖之异常大讨论 原帖链接http://www.iteye.com/topic/2038 Robbin的观点 观点1:Exception实际上代表了一个UseCase中的异常流的处理. 绝 ...

  5. C语言教你写个‘浪漫烟花‘---特别漂亮

    效果展示 动态图 总体框架 /***************************************** * 项目名称:浪漫烟花 * 项目描述:贴图 * 项目环境:vs2019 * 生成日期: ...

  6. 使用 ASP.NET Core 3.1 的微服务开发指南

    使用 ASP.NET Core 3.1 的微服务 – 终极详细指南 https://procodeguide.com/programming/microservices-asp-net-core/ A ...

  7. spring-cloud-square开发实战(三种类型全覆盖)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<五分钟搞懂spring-clou ...

  8. GDI+图形图像技术1

    System.Drawing命名空间提供了对GDI+基本图形功能的访问,其中一些子命名空间中提供了更高级的功能. GDI+由GDI发展而来,是Windows图形显示程序与实际物理设备之间的桥梁. GD ...

  9. python环境搭建、pycharm安装

    一.      实验目标 (1)  Python环境搭建 (2)  会pycharm安装和使用 (3)  了解python程序设计流程 二.      实验内容 1.勾选Add Python 3.7 ...

  10. 检查redis是否正常运行

    [XX@XXX]$ ps -ef | grep redisXX   8047 1 0 10:06 ? 00:00:03 redis-server *:6379XX   9983 9802 0 11:2 ...