1321. [ZJOI2012] 灾难
1321. [ZJOI2012] 灾难
★★☆ 输入文件:catas.in 输出文件:catas.out 简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
阿米巴是小强的好朋友。
阿米巴和小强在草原上捉蚂蚱。小强突然想,如果蚂蚱被他们捉灭绝了,那
么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的
生态灾难。
学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统。如果蚂蚱灭
绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾
难。
我们现在从专业一点的角度来看这个问题。我们用一种叫做食物网的有向图
来描述生物之间的关系:
一个食物网有 N个点,代表 N 种生物,如果生物 x 可以吃生物 y,那么从 y
向 x 连一个有向边。
这个图没有环。
图中有一些点没有连出边,这些点代表的生物都是生产者,可以通过光合作
用来生存; 而有连出边的点代表的都是消费者,它们必须通过吃其他生物来生
存。
如果某个消费者的所有食物都灭绝了,它会跟着灭绝。
我们定义一个生物在食物网中的“灾难值”为,如果它突然灭绝,那么会跟
着一起灭绝的生物的种数。
举个例子:在一个草场上,生物之间的关系是:

如果小强和阿米巴把草原上所有的羊都给吓死了,那么狼会因为没有食物而
灭绝,而小强和阿米巴可以通过吃牛、牛可以通过吃草来生存下去。所以,羊的
灾难值是 1。但是,如果草突然灭绝,那么整个草原上的 5 种生物都无法幸免,
所以,草的灾难值是 4。
给定一个食物网,你要求出每个生物的灾难值。
【输入格式】
输入文件 catas.in 的第一行是一个正整数 N,表示生物的种数。生物从 1 标
号到 N。
接下来 N 行,每行描述了一个生物可以吃的其他生物的列表,格式为用空
格隔开的若干个数字,每个数字表示一种生物的标号,最后一个数字是 0 表示列
表的结束。
【输出格式】
输出文件 catas.out 包含N行,每行一个整数,表示每个生物的灾难值。
【样例输入】
5
0
1 0
1 0
2 3 0
2 0
【样例输出】
4
1
0
0
0
【样例说明】
样例输入描述了题目描述中举的例子。
【数据规模】
对 50%的数据,N ≤ 10000。
对 100%的数据,1 ≤ N ≤ 65534。
输入文件的大小不超过 1M。保证输入的食物网没有环。
#include <cstring>
#include <cstdio>
#include <queue>
#define cle(a,b) memset(a,b,sizeof a)
using namespace std;
int n;
struct edge
{
int v,next;
} e[]; int cnt;
int head[];
int thead[];
int HEAD[];
int t,u,v;
int fa[][],depth[];
int cause[];
int ts[],in[];
queue<int>q; void adde (int u,int v)
{
e[++cnt].v = v;
e[cnt].next = thead[u];
thead[u] = cnt;
e[++cnt].v = u;
e[cnt].next = head[v];
head[v] = cnt;
}
void read ()
{
cle(head,-);
cle(thead,-);
cle(HEAD,-);
scanf("%d",&n);
for(int i = ; i <= n; i++)
{
while(scanf("%d",&t),t)
{
adde(t,i);
in[i]++;
}
}
}
void topsort ()
{
t = ;
for(int i = ; i <= n; i++)
if(!in[i])
q.push(i);
while(!q.empty())
{
u = q.front();
q.pop();
ts[++t] = u;
for(int i = thead[u]; i != -; i = e[i].next)
{
v = e[i].v;
in[v]--;
if(!in[v])
q.push(v);
}
}
}
void go_up (int &u,int d)
{
int temp = ;
while(d)
{
if(( << temp) <= d)
{
d -= ( << temp);
u = fa[u][temp];
}
temp--;
}
}
int lca (int u,int v)
{
if(depth[u] != depth[v])
go_up(u,depth[u] - depth[v]);
if(u == v)
return u;
int temp = ;
do
{
if(fa[u][--temp] != fa[v][temp])
{
u = fa[u][temp];
v = fa[v][temp];
}
}
while(temp);
return fa[v][];
}
void ADDE (int u,int v)
{
e[++cnt].v = v;
e[cnt].next = HEAD[u];
HEAD[u] = cnt;
}
void build ()
{
for(int i = ; i <= n; i++)
{
t = -;
for(int j = head[ts[i]]; j != -; j = e[j].next)
{
if(t == -)
t = e[j].v;
else t = lca( depth[t] > depth[e[j].v] ? t : e[j].v , depth[t] > depth[e[j].v] ? e[j].v : t );
}
fa[ts[i]][] = t == - ? : t;
depth[ts[i]] = depth[t] + ;
ADDE(t,ts[i]);
for(int j = ; j <= ; j++)
fa[ts[i]][j] = fa[fa[ts[i]][j - ]][j - ];
}
}
void dfs (int U)
{
for(int i = HEAD[U]; i != -; i = e[i].next)
{
dfs(e[i].v);
cause[U] += cause[e[i].v] + ;
}
}
int main ()
{
freopen("catas.in","r",stdin);
freopen("catas.out","w",stdout);
read();
topsort();
build();
for(int i = ; i <= n; i++)
if(depth[i] == )
dfs(i);
for(int i = ; i <= n; i++)
printf("%d\n",cause[i]);
return ;
}
1321. [ZJOI2012] 灾难的更多相关文章
- Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造
Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...
- 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA
[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...
- [洛谷P2597] [ZJOI2012]灾难
洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...
- 洛谷 P2597 [ZJOI2012]灾难 解题报告
P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...
- P2597 [ZJOI2012]灾难——拓扑,倍增,LCA
最近想学支配树,但是基础还是要打好了的: P2597 [ZJOI2012]灾难 这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝: 求得就是一个点能支配几个点: 如果一个 ...
- BZOJ 2815: [ZJOI2012]灾难
呃,题面没了,大概就是给出一些生物之间的捕食关系,求灭绝树每个点的灾难值. 拓扑排序之后倒着加入点,动态维护fa[][]数组,倍增法求LCA,当然大佬愿意写动态树也是极好的…… #include &l ...
- BZOJ2815: [ZJOI2012]灾难
传送门 学LCA的时候根本没意识到LCA可以有这么多玩法. 这玩意据说是个高级数据结构(支配树)的弱化版,蒟蒻没学过呀.所以出题人提出一个概念叫灾难树. 我理解的灾难树的意思实际上是属于DAG的一个子 ...
- 2815: [ZJOI2012]灾难 - BZOJ
题目描述 Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 ...
- [ZJOI2012]灾难(建图)
阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告诉小强,草 ...
随机推荐
- 百度地图JavaScript开发入门先知
最近项目紧急开发了一些百度地图的功能,觉得百度地图实数强大!于是今天不忙总结一下,看到不错的文章先转载. 文章出处:https://www.opengps.cn/Blog/View.aspx?id=1 ...
- 小故事学设计模式之Observer : (三) 老婆帮忙订机票
(IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便还能跟同行们交流一下) 要和老婆一起回老家了, 成都离我们安徽太远, 两个人飞一下过去就要花掉近三千块, 于是我 ...
- [转]Ubuntu 配置 Android 开发 环境
转自:http://blog.csdn.net/shulianghan/article/details/20855541 1. 安装 Android Studio (1) 下载Android Stud ...
- bootstrap table通过ajax获取后台数据展示在table
1. 背景 bootstrap table 默认向后台发送语法的dataType为 json,但是为了解决跨域问题我们需要将dataType改为jsonp,这时就需要修改bootstrap table ...
- ArcGIS10.1之crossdomain文件
大家都知道在10.1之前的版本在开发的时候需要使用跨域部署文件crossdomain.xml文件,在10.1中该文件不需要单独拷贝到IIS根目录或者是java版本的weboutput目录,在serve ...
- python:序列与模块
一,序列化模块 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就 ...
- 【BZOJ1171】大sz的游戏(线段树+单调队列)
点此看题面 大致题意: 有\(n\)个点,两点间最大通讯距离为\(L\).已知除\(1\)号点外第\(i\)个点能够发出和接收的信号区间\([l_i,r_i]\)以及到\(1\)号点的距离\(dis_ ...
- 2018.11.29 Struts2中拦截器的学习&项目的实际运用
struts2官方架构 拦截器的创建 第一种方式 第二种方式 看源码AbstractInterceptor 底层已经帮我们写过这些方法了 第三种方式(推荐) 拦截器API学习 放行 前后处理 不放行, ...
- js数组、字符串常用方法
数组方面 push:向数组尾部增加内容,返回的是新数组的长度. var arr = [1,2,3]; console.log(arr); var b = arr.push(4); console.lo ...
- 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...