【bzoj2815】灾难[ZJOI2012](拓扑排序+lca)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2815
原版题解:http://fanhq666.blog.163.com/blog/static/8194342620124274154996/
首先这个生态系统里可能有多个生产者,所以我们可以让生产者吃一种构造出来的食物——阳光。
这道题的图没有环(不然还怎么叫食物网),所以我们可以用拓扑排序把从阳光到各级消费者的先后顺序求出来。
我们可以建出一个结构(可以证明这个结构是一棵树),生物x会因为生物y的灭绝而灭绝,当且仅当y是x的祖先。
因此,如果一种生物会灭绝,只能是因为它的所有食物的lca灭绝了,否则至少有一种食物不会灭绝,这种生物也能活下去,所以这种生物在树上的位置就是它所有食物的lca的孩子。
然后我们把树建出来之后每个节点的答案就是以他为根的子树的节点个数-1。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
ll read()
{
ll tmp=; char f=,c=getchar();
while(c<''||''<c){if(c=='-')f=-; c=getchar();}
while(''<=c&&c<=''){tmp=tmp*+c-''; c=getchar();}
return tmp*f;
}
using namespace std;
int fir[]={},ne[],to[],x[],y[];
int q[],vis[]={};
ll in[]={},cnt[];
int fa[][],dep[];
int n,m,tot=;
void add(int x,int y){to[++tot]=y; ne[tot]=fir[x]; fir[x]=tot;}
int lca(int x,int y)
{
int i;
if(dep[x]<dep[y]){int tmp=x; x=y; y=tmp;}
for(i=(int)(log(n)/log()+);i>=;i--)if(dep[x]-(<<i)>=dep[y])x=fa[x][i];
if(x==y)return x;
for(i=(int)(log(n)/log()+);i>=;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][];
}
int main()
{
int i,j;
n=read();
for(i=;i<=n;i++){
int k=read();
if(!k)add(,i),in[i]=,x[tot]=i,y[tot]=;
while(k){++in[i]; add(k,i); x[tot]=i; y[tot]=k; k=read();}
}
int h=,t=; q[]=; vis[]=;
while(h<=t){
for(i=fir[q[h]];i;i=ne[i]){
--in[to[i]];
if(!in[to[i]])q[++t]=to[i],in[to[i]]=<<;
}
++h;
}
m=tot; tot=;
for(i=;i<=n;i++)fir[i]=;
for(i=;i<=m;i++)add(x[i],y[i]);
for(i=;i<=n;i++)
for(j=;<<j<=n;j++)
fa[i][j]=-;
fa[][]=-; dep[]=;
for(i=;i<=n;i++){
int p=-;
for(j=fir[q[i]];j;j=ne[j])
if(p==-)p=to[j];else p=lca(p,to[j]);
fa[q[i]][]=p; dep[q[i]]=dep[p]+;
for(j=;<<j<=n&&fa[fa[q[i]][j-]][j-]>=;j++)fa[q[i]][j]=fa[fa[q[i]][j-]][j-];
}
for(i=;i<=n;i++)cnt[i]=;
for(i=n;i;i--)cnt[fa[q[i]][]]+=cnt[q[i]];
for(i=;i<=n;i++)
printf("%lld\n",cnt[i]-);
}
bozj2815
【bzoj2815】灾难[ZJOI2012](拓扑排序+lca)的更多相关文章
- 【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)
懒得复制,戳我戳我 Solution: 这题思路很神奇,首先你要知道这个毁灭树是怎么保证实现的:一句话就是如果该节点要被破坏,他的所有父节点就要被破坏,也就只要所有父节点的LCA被破坏就可以,所以我们 ...
- 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA
[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...
- BZOJ2815:[ZJOI2012]灾难(拓扑排序,LCA)
Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过 ...
- [BZOJ2815][ZJOI2012]灾难 灭绝树+拓扑排序+lca
灾难 [问题描述] 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那 么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 生态灾难. 学过 ...
- BZOJ2815 拓扑排序 + LCA
https://www.lydsy.com/JudgeOnline/problem.php?id=2815 作为一个DAG图,结点之间又有这么明显的等级之分,很容易想到的是拓扑排序. 但是不管是正向的 ...
- 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA
题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ...
- 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]
题目传送门 灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. ...
- [BZOJ2815][ZJOI2012]灾难(拓扑排序/支配树)
支配树目前只见到这一个应用,那就不独分一类,直接作为拓扑排序题好了. 每个点向所有食物连边,定义fa[x]为x的支配点,即离x最近的点,满足若fa[x]灭绝,则x也要灭绝. 这样,将fa[x]向x连边 ...
- P2597 [ZJOI2012]灾难 拓扑排序
这个题有点意思,正常写法肯定会T,然后需要优化.先用拓扑排序重构一遍树,然后进行一个非常神奇的操作:把每个点放在他的食物的lca上,然后计算的时候直接dfs全加上就行了.为什么呢,因为假如你的食物的l ...
随机推荐
- < 转载 > 说说JSON和JSONP
推荐博文---说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 里头说的很详细!
- Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.3——整合resource文件
问题: 想要在product的flavor里面改变图片,文字或者其它资源. 解决方案: 在flavor里面增加合适的资源目录,并且改变他们包含的值. 讨论: 考虑下3.2章的“hello world ...
- 爬虫入门【8】Python连接MongoDB的用法简介
MongoDB的连接和数据存取 MongoDB是一种跨平台,面向文档的NoSQL数据库,提供高性能,高可用性并且易于扩展. 包含数据库,集合,文档等几个重要概念. 我们在这里不介绍MongoDB的特点 ...
- 1624 取余最长路(set)
1624 取余最长路 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 佳佳有一个n*m的带权矩阵,她想从(1,1)出发走到(n,m)且只能往右往下移动,她能得到的娱 ...
- Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式
Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
- Sublime Text 3如何快速生成HTML5的头部信息和常用的快捷键
一.快速生成HTML5的头部信息的步骤: 1.Ctrl + N,新建一个文档: 2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式: 3. ...
- zookeeper 命令行使用
先用简易的客户端链接上 默认链接的就是本机上面的zkserver 我一上来help 下.没办法 ,用的少,先喊一声救命 ,看看有没有人救我! [zk: localhost:2181(CONNECTED ...
- Lucene索引数计算
Elasticsearch默认在创建索引结束时得到5个分片及1个副本: 分片是有0-n个副本,“5个分片及1个副本”即“5个分片及5个相应分片副本”:共10个Lucene索引 副本数:指的是“单个分片 ...
- mesos cluster
http://spark.apache.org/docs/latest/running-on-mesos.html http://stackoverflow.com/questions/1993985 ...
- 解决windows server 2003不识别移动硬盘
解决windows server2003不显示移动硬盘的问题: 1.进入命令提示符环境(也就是DOS) 2.进入DISKPART程序 3.输入AUTOMOUNT ENABLE指令 4.输入OK 下次U ...