\(\\\)

Description


给出一个食物网,每个生物指向的生物都是它可以捕食的对象,保证是图是DAG。

如果一个捕食者的所有捕食对象都灭绝了,那么它们也会灭绝。

求每一个动物灭绝之后,有多少个动物会随之灭绝。

  • \(n\le 65534\)

Solution


考察建图思维的好题。

如果我们按照 捕食者\(\to\)捕食对象 的关系连边,那么我们得到的是一张捕食关系的流向图,无法判断反向的影响。

所以要按照 捕食对象\(\to\)捕食者 的关系连边,得到的是一张能量供应的流向图。

那么形象的说,每个点都把能量流向出边指向的点,如果一个点消失了,从他这里流出去的所有能量全都消失。

如果这个时候某些点没有能量流入,那么这些点就是需要统计到消失点的答案里。

但是只有这些吗?并不是。因为这些受影响消失的点可能继续导致一些点消失,后面的答案我们没有统计。

我们设 \(die_x\) 表示节点 x 如果消失,有连边的点直接消失的点的个数。

那么我们一个点要累加的,就是所有直接指向的消失的点的个数+这些点的 \(die\) 值。


考虑如何求出 \(die\) 值。我们发现这就是能量供应关系的图的拓扑序。

我们新建一棵树形结构,父子关系表示,如果父节点消失,子节点必然消失。

首先将这张能量供应图中所有入度为 \(0\) 的点连向虚拟根节点,代表他们不会因为别的生物灭亡而灭亡。

然后考虑拓扑到一个点时,它应该作为哪个节点的子节点。显然是它的所有食物在这棵树上的 \(LCA\)。

因为拓扑,所以他的所有食物必然已经在这个树上,我们两两合并求 \(LCA\) 即可。

因为要找所有在能量供给图上指向当前点的点,所以我们还要把捕食的图建出来,便于找食物有哪些。

因为求 \(LCA\) 多次,需要 \(log\) 的复杂度,因为树的形态是变化的,所以链剖和离线算法显然都不行。

考虑倍增。查找两两合并是没有问题了,但是新插入节点怎么办?

注意到倍增数组的构造只需要知道父节点,所以在把拓扑到的点插入树的同时构造一下倍增数组就好了。

因为这个树的定义,每一个点的答案显然是子树大小 \(-1\) 。

Code


一直 \(90\) 不知道为什么,后来发现........

在 \(LCA\) 的时候根节点设成了 \(n+1\) ,但是如果倍增的时候深的跳超了,但是另一个是根节点,根据判断条件并没有跳超深度,它就会跳到 0 号节点然后 GG....

给 \(n+1\) 号节点设个深度,或者根节点换成 \(0\) 号节点就好啦

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 70000
#define R register
#define gc getchar
using namespace std;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x;
}int n,m,tot,hd[N],deg[N],tot2,hd2[N];int t,tot1,d[N],hd1[N],f[N][20],ans[N];struct edge{int to,nxt;}e[N<<3],e1[N<<1],e2[N<<3];inline void add(int u,int v){e[++tot].to=v; e[tot].nxt=hd[u]; hd[u]=tot;
}inline void add1(int u,int v){e1[++tot1].to=v; e1[tot1].nxt=hd1[u]; hd1[u]=tot1;
}inline void add2(int u,int v){e2[++tot2].to=v; e2[tot2].nxt=hd2[u]; hd2[u]=tot2;
}inline void getfa(int u,int fa){f[u][0]=fa; d[u]=d[fa]+1;for(R int i=1;i<=t;++i) f[u][i]=f[f[u][i-1]][i-1];
}inline int lca(int u,int v){if(d[u]>d[v]) u^=v^=u^=v;for(R int i=t;~i;--i) if(d[f[v][i]]>=d[u]) v=f[v][i];if(u==v) return u;for(R int i=t;~i;--i)if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];return f[u][0];
}inline void work(int u){int res=e2[hd2[u]].to;for(R int i=e2[hd2[u]].nxt;i;i=e2[i].nxt) res=lca(res,e2[i].to);getfa(u,res); add1(u,res); add1(res,u);
}void dfs(int u,int fa){for(R int i=hd1[u],v;i;i=e1[i].nxt)if((v=e1[i].to)!=fa){dfs(v,u); ans[u]+=ans[v];}
}queue<int> q;int main(){t=log2(n=rd())+1;for(R int i=1,x;i<=n;++i){x=rd();while(x){++deg[i];add(x,i);add2(i,x);x=rd();}ans[i]=1;}for(R int i=1;i<=n;++i)if(!deg[i]){q.push(i); getfa(i,0);add1(i,0); add1(0,i);}while(!q.empty()){int u=q.front(); q.pop();for(R int i=hd[u],v;i;i=e[i].nxt)if((--deg[v=e[i].to])==0) q.push(v),work(v);}dfs(0,-1);for(R int i=1;i<=n;++i) printf("%d\n",ans[i]-1);return 0;
}

转载于:https://www.cnblogs.com/SGCollin/p/9949158.html

[ ZJOI 2012 ] 灾难相关推荐

  1. [ZJOI 2012]灾难

    Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生 ...

  2. linux文件名 -%3e,linux下的三种解压文件的命令?

    那要看你的压缩文件使用哪种压缩方式: gzip,压缩文件名:zip或gz,解压命令:unzip bzip2,压缩文件名:bz,解压命令:bzip2 -d 上面两个是最常用的压缩方式,一般在linux下 ...

  3. 排行榜上用C++写局域网聊天程序

    摘要:用C++写局域网聊天程序 2012年07月09日啰嗦完天使之道,尽量将具有相类似功能的即时通讯软件用例抽象并归类,防属性,揭开人类进程的惊天秘密,并没有攻击技能,用C++写局域网聊天程序获得了众 ...

  4. android power键测试,Android Framework层Power键关机流程(一,Power长按键操作处理)...

    一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...

  5. 天灾不可抗 手机预警应用提前防

    7月21日上午至22日凌晨,北京周末"61"年一遇的一场暴雨引发内涝灾害,牵动了全国人民的心,这场突如其来的强降雨导致北京"30"多人死亡.人类在自然灾害面前往 ...

  6. 《2012》:让灾难成为一场洗礼

    ■片名:<2012> ■导演:罗兰·艾默里奇 ■主演:约翰·库萨克.阿曼达·皮特.切瓦特·埃加福特 ■发行: 哥伦比亚影片公司 ■上映时间:2009年11月 ■读家:兴安  ■推荐指数★★ ...

  7. 《2012》灾难电影引发恐慌 NASA无奈出面辟谣

    11月9日,美国宇航局(NASA)在官方网站上公开声明:2012年12月21日不是世界末日.NASA此举实在是无奈辟谣,由于对未知灾难的恐惧,许多网民认为电影<2012>关于世界末日的故事 ...

  8. 灾难片《2012》 下载

    这可是真正<2012> 下载的,昨晚在网上搜索到 的,但压缩被加密,西西可是有一般常识的人一看就知道压缩的密码是多少了, 这是下载地址``http://www.amvba.cn/ftp/b ...

  9. Windows Server 2003 磁盘镜像卷实现双硬盘数据灾难备份 2012

    在Windows Server 2003中,要创建镜像卷首先需要保证有两个或以上的动态磁盘,如果这其中包括安装Windows Server 2003操作系统的磁盘,则要转换成动态磁盘后,需要重新启动操 ...

最新文章

  1. 使用克隆配置任务配置边缘传输服务器角色
  2. golang 打印函数名/文件名/行号 Callers
  3. 深入浅出python机器学习_6.3.1_随机森林实例——要不要和相亲对象进一步发展
  4. 阿里数据库内核月报:2017年04月
  5. 20080408 - VS2003 中 Jscript 文件中文乱码问题
  6. 信息学奥赛一本通 1001:Hello,World | OpenJudge NOI 1.1 01:Hello, World
  7. SLF4J和Logback日志框架详解
  8. 使用runtime 实现weex 跳转原生页面
  9. bigdicmal除法精度设置_java中BigDecimal进行加减乘除的基本用法
  10. mybatis3源码1-初始化
  11. 再谈IE的浏览器模式和文档模式[转]
  12. 深入剖析Redis高可用集群架构原理
  13. 西门子g120变频器接线图_西门子S7—1500第二十一讲(G120变频器第一篇)
  14. python开源IP代理池--IPProxys
  15. python operator.add_Python模块:operator简单介绍
  16. Linux CentOS 大数据集群的基础配置(3) CHD分布式环境搭建
  17. netty实现http服务器
  18. 论文中的定理(Theorem)、引理(Lemma)、推论(Corollary)
  19. 寄生电容和分布电容的区别
  20. 超分辨论文阅读笔记:Non-local

热门文章

  1. 每日一题(33)——用两个栈实现一个队列的功能?要求给出算法和思路
  2. 【Pytorch神经网络实战案例】25 (带数据增强)基于迁移学习识别多种鸟类(CUB-200数据集)
  3. 搞懂DEtection TRanformer(DETR)
  4. pip install时发生raise ReadTimeoutError(self._pool, None, 'Read timed out.')的解决方案
  5. 流畅的Python 2. 数据结构 - 序列构成的数组
  6. LeetCode 552. 学生出勤记录 II(动态规划)
  7. LeetCode 822. 翻转卡片游戏(哈希)
  8. LeetCode MySQL 1543. Fix Product Name Format(trim去空格+upper/lower大小写)
  9. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)
  10. LeetCode 234. 回文链表(快慢指针+链表反转)