[ ZJOI 2012 ] 灾难

\(\\\)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解读:欧盟委员会2021年《人工智能法》提案

来源&#xff1a;图灵人工智能文&#xff1a;吴沈括&#xff08;北京师范大学网络法治国际中心执行主任、博导中国互联网协会研究中心副主任&#xff09;文&#xff1a;胡然&#xff08;北京师范大学网络法治国际中心研究助理&#xff09;2021年4月21日&#xff0c;为了将欧洲变…

《2021人脸识别行业白皮书》发布 拥挤安防还有多少空间?

来源&#xff1a;帮尼资讯图片来源&#xff1a;网络人脸识别在内的人工智能技术需求较大&#xff0c;这对传统安防产业带来了巨大的冲击和变革。近日&#xff0c;智慧芽联合罗思咨询&#xff0c;共同发布《2021人脸识别行业白皮书》。白皮书从人脸识别行业现状、企业聚焦和技术…

Leetcode905.Sort Array By Parity按奇偶排序数组

给定一个非负整数数组 A&#xff0c;返回一个由 A 的所有偶数元素组成的数组&#xff0c;后面跟 A 的所有奇数元素。 你可以返回满足此条件的任何数组作为答案。 示例&#xff1a; 输入&#xff1a;[3,1,2,4] 输出&#xff1a;[2,4,3,1] 输出 [4,2,3,1]&#xff0c;[2,4,1,3] 和…

第一章 计算机系统概述 1.1 计算机发展史 [计算机组成原理笔记]

第一章 计算机系统概述 1.1 计算机发展史 本笔记参考书目&#xff1a; 计算机组成原理&#xff08;第六版.立体化教材&#xff09;白中英、戴志涛2021王道计算机组成原理视频公开课 本节重点&#xff1a; 计算机硬件的发展史 转载请注明文章来源&#xff01; 什么是计算机系…

我国工业互联网 技术路线与发展趋势研究

来源&#xff1a;中国工业和信息化本文发表于《中国工业和信息化》杂志2021年4月刊总第33期作者&#xff1a;许雪荷 中国工业互联网研究院自2017年《国务院关于深化“互联网先进制造业”发展工业互联网的指导意见》发布以来&#xff0c;国家高度重视工业互联网创新发展&#…

T-SQL 之 执行顺序

T-SQL 之 执行顺序 转载于:https://www.cnblogs.com/macT/p/9952172.html

【创新应用】小图像,大图景:AI彻底改变了显微镜技术

来源&#xff1a;智能研究院20 年前&#xff0c;计算机生物学家 Anne Carpenter 在读博士时第一次意识到她需要学习计算机编程。Carpenter 说&#xff1a;「在麻省理工学院和哈佛大学的博德研究所 (Broad Institute of MIT and Harvard in Cambridge) 管理实验室的时候。她记得…

js 简单弹框toast

新建toast.js文件 function Toast(msg,duration){durationisNaN(duration)?3000:duration;var m document.createElement(div);m.innerHTML msg;m.style.cssText"max-width:60%;min-width: 150px;padding:0 14px;height: 40px;color: rgb(255, 255, 255);line-height: …

历史上12篇最著名的博士论文欣赏

来源 &#xff1a; 学位与写作Ali Gajani在mrgreek网站分享了12篇著名学者的博士论文&#xff0c;分别是居里夫人的博士论文、香浓的博士论文、纳什的博士论文、德布罗意的博士论文、费曼的博士论文、爱因斯坦的博士论文、马克思的博士论文、韦伯的博士论文、萨特兰的博士论文、…

Exalogic硬件架构

1、硬件配置见如下图表。 组件名称满配半配1/4配1/8配Sun Rack II 12421111计算节点 X2-2、X3-2、X4-2、X5-2、X6-2301684存储设备 X2-2和X3-2: Dual controller Sun ZFS Storage 7320 appliance (60 TB) X4-2和X5-2: Oracle ZS3-ES storage appliance X6-2: Oracle ZS5–ES st…

AI领域五年引用量最高的10大论文:Adam登顶,AlphaGo、Transfromer上榜

来源&#xff1a;图灵人工智能编译&#xff1a;琰琰近五年来&#xff0c;AI学术论文的投稿量和接收量都在不断攀升&#xff0c;包括NeurIPS、AAAI、ACL&#xff0c;ICML、EMNLP等国际顶会。根据权威数据统计&#xff0c;NeurIPS论文收录量在2019年呈指数级增长&#xff0c;领先…

64 求1+2+3+...+n(发散思维能力 )

题目描述&#xff1a; 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 解题思路&#xff1a; 1&#xff09;利用&&的短路特性 2) 利用sizeof特性&#xff0c;使用公式n(n1)/2 …

Cell Reports:黄梓芮等揭示大脑皮层中通往意识的“大门”

来源&#xff1a;小柯生命北京时间2021年5月4日晚23时&#xff0c;Cell Reports在线发表美国密歇根大学一项关于前脑岛在大脑网络切换和意识通达中关键门控作用的研究——“Anterior insula regulates brain network transitions that gate conscious access”。此研究由密歇根…

第一轮冲刺第一天

今天我们完成了二维迷宫草图的制作&#xff0c;我主要负责在3dmax里画草图。 明天我将负责对二维迷宫草图的检核和完善。转载于:https://www.cnblogs.com/xuzhengdong/p/9966216.html

DeepMind强化学习新研究:更快的知识学习,更强的环境适应

来源&#xff1a;AI科技评论编译&#xff1a;Mr Bear校对&#xff1a;维克多DeepMind官方博客在一篇文章“Fast reinforcement learning through the composition of behaviours”中&#xff0c;针对强化学习中的“从头学习”问题给予了解决方案。文章中表示&#xff0c;人类处…

php 文件加载方式

两种加载文件的方式 includerequire使用场景&#xff1a; 动态加载文件的时候&#xff0c;使用include&#xff0c;否则使用require。 示例&#xff1a; # 引入php文件--include方式 inlcude("./functions_func.php"); 或 inlcude "./functions_func.php";…

为什么AI无法解决一般智能问题?

来源&#xff1a;学术头条我们什么时候才能拥有在各方面能够模仿人脑的人工智能&#xff1f;专家们对这个问题意见不一。但大家都同意的是&#xff0c;目前的人工智能系统与人类的智力相去甚远。直接表现是&#xff1a;AI只在特定任务中表现优异&#xff0c;无法将其能力扩展到…

ADT操作实例

ps.1.put(rank,value) 把当前rank的元素的数值修改 2.get(rank)获取rank的元素 3.remove(value)把向量中value剔除掉 4.size()返回元素个数 5.disordered()检测向量的有序性&#xff0c;是否存在紧邻的逆序对&#xff0c;只要返回的数值不是0&#xff0c;说明它尚未构成有序的序…

群雄逐鹿,谁会赢得自动驾驶之战?

来源&#xff1a;AI前线作者 | Timothy B.Lee译者 | 王强策划 | 刘燕自动驾驶技术行业今天正处于一种奇怪的状态。过去多年来&#xff0c;整个行业已经在自动驾驶技术上投入了庞大的资金&#xff0c;其中许多公司都拥有了看起来跑得不错的自动驾驶汽车原型。但据我所知&#xf…