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. TypeError: module() takes at most 2 arguments (3 given)

    1. 错误提示 2. 代码 class Parent: """定义父类""" def __init__(self): print(" ...

  2. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

  3. Scrum Meeting 0505

    零.说明 日期:2021-5-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成邮箱注册页面功 ...

  4. UltraSoft - Beta - Scrum Meeting 6

    Date: May 22n'd, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 修复了DDL日程自动发邮件被服务器"吞掉"的bug后端增加了 ...

  5. [对对子队]会议记录5.18(Scrum Meeting5)

    今天已完成的工作 何瑞 ​ 工作内容:搭建第8关 ​ 相关issue:搭建关卡7.8.9 ​ 相关签入:feat:初步搭建了Lv8 吴昭邦 ​ 工作内容:搭建第8关 ​ 相关issue:搭建关卡7.8 ...

  6. stm32电机控制之控制两路直流电机

    小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下: 由以上框图可知,STM32通过定时器模块输出PWM波来控制两个直流电机的转动 ...

  7. 全志Tina_dolphin播放音视频裸流(h264,pcm)验证

    最近在验证tina对裸流音视频的支持,主要指h264视频裸流及pcm音频裸流. 在原始sdk中有针对很多video和audio类型的parser,但就是没有找到pcm和h264的parser,所以需要 ...

  8. cf Two Sets (我用二分最大匹配做的)

    题意: n个数p1,p2....pn     两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...

  9. Vue3学习(十)之 页面、菜单、路由的使用

    一.前言 好几天没更文了,周末真的太冷了,在家躺了一天不爱动.今天给暖气了,相对不那么冷了,就可以继续更文了. 由文章标题不难看出,就是实现点击菜单跳转的意思,我写的很直白了,哈哈. 二.实现点击菜单 ...

  10. 让Visual Studio x64 支持 __asm内联汇编

    目录 让Visual Studio x64 支持 __asm内联汇编 Intel Parallel Studio XE 2016安装 设置Interl C++ Compiler 使VS x64支持内联 ...