2815: [ZJOI2012]灾难 - BZOJ
题目描述 Description
阿米巴是小强的好朋友。
阿米巴和小强在草原上捉蚂蚱。小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难。
学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统。如果蚂蚱灭绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾难。
我们现在从专业一点的角度来看这个问题。我们用一种叫做食物网的有向图来描述生物之间的关系:
一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连一个有向边。
这个图没有环。
图中有一些点没有连出边,这些点代表的生物都是生产者,可以通过光合作用来生存; 而有连出边的点代表的都是消费者,它们必须通过吃其他生物来生存。
如果某个消费者的所有食物都灭绝了,它会跟着灭绝。
我们定义一个生物在食物网中的“灾难值”为,如果它突然灭绝,那么会跟着一起灭绝的生物的种数。
举个例子:在一个草场上,生物之间的关系是:
如果小强和阿米巴把草原上所有的羊都给吓死了,那么狼会因为没有食物而灭绝,而小强和阿米巴可以通过吃牛、牛可以通过吃草来生存下去。所以,羊的灾难值是1。但是,如果草突然灭绝,那么整个草原上的5种生物都无法幸免,所以,草的灾难值是4。
给定一个食物网,你要求出每个生物的灾难值。
输入描述 Input Description
第一行是一个正整数N,表示生物的种数。生物从1标号到N。
接下来N行,每行描述了一个生物可以吃的其他生物的列表,格式为用空格隔开的若干个数字,每个数字表示一种生物的标号,最后一个数字是0表示列表的结束。
输出描述 Output Description
包含N行,每行一个整数,表示每个生物的灾难值
样例输入 Sample Input
5
0
1 0
1 0
2 3 0
2 0
样例输出 Sample Output
4
1
0
0
0
数据范围及提示 Data Size & Hint
对50%的数据,N ≤ 10000。
对100%的数据,1 ≤ N ≤ 65534。
输入文件的大小不超过1M。保证输入的食物网没有环。
对于一个点i,他的死亡应该被一系列点影响(就是j死了i就会死),这些点就是这个点i往下走的必经之点
这些点构成一条链,所以可以用前缀和的思想来累加,所以我们只要求出这个点链的next是什么
所以现在关键是求这next
然后我就用了lca来求next
每个点向他的next连一条边,一个点的next就是他的儿子的最近公共祖先
const
maxn=;
maxm=;
var
d,ans,first,dep:array[..maxn]of longint;
last,next:array[..maxm]of longint;
f:array[..maxn,..]of longint;
n,tot:longint; procedure insert(x,y:longint);
begin
inc(d[y]);
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; var
q:array[..maxn]of longint;
l,r:longint; procedure init;
var
i,x:longint;
begin
read(n);
for i:= to n do
begin
read(x);
while x<> do
begin
insert(i,x);
read(x);
end;
end;
l:=;
for i:= to n do
if d[i]= then
begin
inc(r);
q[r]:=i;
end;
end; procedure new(x:longint);
var
i:longint;
begin
i:=;
while f[x,i]<> do
begin
f[x,i+]:=f[f[x,i],i];
inc(i);
end;
end; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; function lca(x,y:longint):longint;
var
k:longint;
begin
if dep[x]<dep[y] then swap(x,y);
while dep[x]>dep[y] do
x:=f[x,trunc(ln(dep[x]-dep[y])/ln())];
if x=y then exit(x);
while f[x,]<>f[y,] do
begin
k:=;
while f[x,k+]<>f[y,k+] do
inc(k);
x:=f[x,k];
y:=f[y,k];
end;
exit(f[x,]);
end; procedure work;
var
i,j,t:longint;
begin
while l<=r do
begin
for i:=l to r do
begin
j:=first[q[i]];
while j<> do
begin
dec(d[last[j]]);
if d[last[j]]= then
begin
inc(r);
q[r]:=last[j];
end;
j:=next[j];
end;
end;
l:=i+;
end;
for i:=n downto do
begin
j:=first[q[i]];
t:=last[j];
j:=next[j];
while j<> do
begin
t:=lca(t,last[j]);
j:=next[j];
end;
f[q[i],]:=t;
dep[q[i]]:=dep[t]+;
new(q[i]);
end;
for i:= to n do
inc(ans[f[q[i],]],ans[q[i]]+);
for i:= to n do
writeln(ans[i]);
end; begin
init;
work;
end.
2815: [ZJOI2012]灾难 - BZOJ的更多相关文章
- BZOJ 2815: [ZJOI2012]灾难
呃,题面没了,大概就是给出一些生物之间的捕食关系,求灭绝树每个点的灾难值. 拓扑排序之后倒着加入点,动态维护fa[][]数组,倍增法求LCA,当然大佬愿意写动态树也是极好的…… #include &l ...
- bzoj 2815 [ZJOI2012]灾难(构造,树形DP)
[题意] 求把每个点删除后,不可达点的数目. [思路] 构造一棵“灭绝树”,要求这棵树满足如果删除根节点后则该子树内的所有结点都不可达.则答案为子树大小-1. 如何构造这棵“灭绝树”? 将原图拓扑排序 ...
- 【BZOJ】2815: [ZJOI2012]灾难
简要题意: 给一个有向无环图,问每个节点删掉之后会导致多少个点不可达. 似乎以前拿来考过.... 我们定义一棵树,它满足对应点造成的灭绝值即为当点的子树大小-1 按照被捕食者--->捕食者的关系 ...
- BZOJ 2815: [ZJOI2012]灾难 拓扑排序+倍增LCA
这种问题的转化方式挺巧妙的. Code: #include <bits/stdc++.h> #define N 100000 #define M 1000000 #define setIO ...
- BZOJ:2815: [ZJOI2012]灾难
题解: 构造灭绝树: x指向的点表示x的祖先死亡则x死亡 动态LCA: 可以用LCT维护或直接更新倍增数组 最后统计子树点的个数 坑: 我还不会序列型Toposort #include<iost ...
- 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA
[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...
- Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造
Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...
- [洛谷P2597] [ZJOI2012]灾难
洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...
- 1321. [ZJOI2012] 灾难
1321. [ZJOI2012] 灾难 ★★☆ 输入文件:catas.in 输出文件:catas.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 阿米巴是小强的 ...
随机推荐
- HDU 5478 Can you find it(快速幂)
Problem Description Given a prime number C(1≤C≤2×105), and three integers k1, b1, k2 (1≤k1,k2,b1≤109 ...
- 联系电话正则表达式(jquery表单验证)
一.实现的效果图: 二.CSS样式 /*验证样式*/ .onError{ vertical-align: middle; color: #ff0000; line-height: 22px; padd ...
- 集合类学习之ArrayList源码解析
1.概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大 ...
- 20141111--SQL触发器
---------------------触发器----------------------------- --触发器本质上还是一个存储过程,trigger --只不过不是通过exec调用执行,而是通 ...
- BeanDefinition的Resource定位——3
1.我们重点看看AbstractRefreshableApplicationContext的refreshBeanFactory方法的实现,这个refreshBeanFactory被FileSyste ...
- ionic2 页面加载时图片添加的问题
使用ionic2创建项目时,在app文件夹下有图片目录img 在home中引用图片,但是不论是用ng-src或者是src,代码如下: <ion-list> <ion-slides c ...
- Linux 伙伴算法简介
本文将简要介绍一下Linux内核中的伙伴分配算法. Technorati 标签: 伙伴算法 算法作用 它要解决的问题是频繁地请求和释放不同大小的一组连续页框,必然导致在已分配 ...
- Nginx在嵌入式系统中的应用
-----------------本文转载自 http://blog.csdn.net/xteda/article/details/39708009 ------------------------- ...
- const type& 与 type& 的区别
const type& 与 type& 是C/C++编程中容易混淆的两个知识点,现在以 cont int& 与 int& 为例讲解: 1.int& 讲解 int ...
- java.util.Vector
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, C ...