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. 网页常用的css特效让互动留住客户

    一般网站如果制作按钮,多做一些互动,可以让客户获得更好的体验. 例如鼠标滑过按钮,让背景颜色从左往右滑出来(或者从右往左都可以): <a target="_blank" hr ...

  2. Golang通脉之方法

    方法和接收者 Go语言中的方法(Method)是一种作用于特定类型变量的函数.这种特定类型变量叫做接收者(Receiver).接收者的概念就类似于其他语言中的this或者 self. Go 语言中同时 ...

  3. SpringCloud 2020.0.4 系列之Eureka

    1. 概述 老话说的好:遇见困难,首先要做的是积极的想解决办法,而不是先去泄气.抱怨或生气. 言归正传,微服务是当今非常流行的一种架构方式,其中 SpringCloud 是我们常用的一种微服务框架. ...

  4. [对对子队]会议记录5.27(Scrum Meeting12)

    今天已完成的工作 朱俊豪 ​ 工作内容:寻找电池模型和BGM,修改关卡选择场景 ​ 相关issue:优化初步导出版本 ​ 相关签入:perf:地图界面优化 feat:更新系列资源(星星,大电池) 何瑞 ...

  5. BUAA SE 个人项目作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 通过个人项目实践熟悉个人开发流程 一.在文章开头给出教学班级和 ...

  6. 进阶区forgotg攻防世界

    攻防世界进阶区--forgot 前言,这题中看不中用啊宝友!!! 1.查看保护 第一反应就是蛮简单的,32位. 2.获取信息(先运行程序看看) 装的可以,蛮多的东西. 但是就是中看不中用 3.ida ...

  7. 【做题记录】 [JLOI2011]不等式组

    P5482 [JLOI2011]不等式组 超烦人的细节题!(本人调了两天 QAQ ) 这里介绍一种只用到一只树状数组的写法(离线). 树状数组的下标是:所有可能出现的数据进行离散化之后的值. 其含义为 ...

  8. python 处理xml 数据

    1 import xml.sax 2 import xml.sax.handler 3 4 # python 处理xml 数据 类,将xml数据转化为字典 5 ''' 6 原数据:<?xml v ...

  9. 【java+selenium3】select 下拉选 (八)

    一.select 下拉框 1.下拉选的处理类:Select 如果页面元素是一个下拉框,我们可以将此web元素封装成Select对象. Select select = new Select(WebEle ...

  10. SpringCloud升级之路2020.0.x版-30. FeignClient 实现重试

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 需要重试的场景 微服务系统中,会遇到在线发布,一般的发布更新策略是:启动一个新的,启动成功 ...