【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 ...
随机推荐
- mongo-connector来同步mongo
个人博客:https://blog.sharedata.info/ 最近需要做mongo之间的同步,因此还是选择之前的工具mongo-connectorgitHub文档:https://github. ...
- 三维空间直线最近点对hdu4741
//求两条直线之间的关系(三维) //输入:两条不为点的直线 //输出:相交返回XIANGJIAO和交点p,平行返回PINGXING,共线返回GONGXIAN int LineAndLine(Line ...
- SonarQube 平台搭建
1. 前期准备 ① 环境 jdk 1.8 配置(见其他随笔) MySQL 5.7(见其他随笔) ② 工具下载 sonarqube 下载 <链接:https://pan.baidu.com/s/1 ...
- 《从零开始学Swift》学习笔记(Day 32)——计算属性
原创文章,欢迎转载.转载请注明:关东升的博客 计算属性本身不存储数据,而是从其他存储属性中计算得到数据. 计算属性概念: 计算属性提供了一个getter(取值访问器)来获取值,以及一个可选的sette ...
- HBase1.2.4基于hadoop2.4搭建
1.安装JDK1.7, Hadoop2.4 2.下载 hbase 安装包 下载地址:http://apache.fayea.com/hbase/1.2.4/hbase-1.2.4-bin.tar.gz ...
- coursera 《现代操作系统》 -- 第七周 存储模型(1)
虚拟地址 隔离进程,便于管理. 问:为什么不直接划分物理地址为一块一块,直接管理,而要做一层虚拟地址的映射呢? 栈和堆 Differences between Stack and Heap Stack ...
- Python: names, values, assignment and mutability
推荐先看视频(youtube) Ned Batchelder - Facts and Myths about Python names and values - PyCon 2015 Change v ...
- Js计算时间差(天、小时、分钟、秒)
<script type="text/javascript"> var date1= '2015/05/01 00:00:00'; //开始时间 var date2 = ...
- 【转】通过VIOS实现AIX系统的网络虚拟化
在上一篇博文中,我们已经在一个新创建的LPAR中通过File-backed device以及VMLibrary的方式成功安装了一个AIX系统,接下来我们讨论如何通过VIOS的协助来完成新装AIX系统的 ...
- 我的Android进阶之旅------>Android百度地图定位SDK功能学习
因为项目需求,需要使用百度地图的定位功能,因此去百度地图开发平台下载了百度地图的Android定位SDK最新版本的开发包和示例代码学习. Android 定位SDK地址:http://develope ...