题目描述 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的更多相关文章

  1. BZOJ 2815: [ZJOI2012]灾难

    呃,题面没了,大概就是给出一些生物之间的捕食关系,求灭绝树每个点的灾难值. 拓扑排序之后倒着加入点,动态维护fa[][]数组,倍增法求LCA,当然大佬愿意写动态树也是极好的…… #include &l ...

  2. bzoj 2815 [ZJOI2012]灾难(构造,树形DP)

    [题意] 求把每个点删除后,不可达点的数目. [思路] 构造一棵“灭绝树”,要求这棵树满足如果删除根节点后则该子树内的所有结点都不可达.则答案为子树大小-1. 如何构造这棵“灭绝树”? 将原图拓扑排序 ...

  3. 【BZOJ】2815: [ZJOI2012]灾难

    简要题意: 给一个有向无环图,问每个节点删掉之后会导致多少个点不可达. 似乎以前拿来考过.... 我们定义一棵树,它满足对应点造成的灭绝值即为当点的子树大小-1 按照被捕食者--->捕食者的关系 ...

  4. BZOJ 2815: [ZJOI2012]灾难 拓扑排序+倍增LCA

    这种问题的转化方式挺巧妙的. Code: #include <bits/stdc++.h> #define N 100000 #define M 1000000 #define setIO ...

  5. BZOJ:2815: [ZJOI2012]灾难

    题解: 构造灭绝树: x指向的点表示x的祖先死亡则x死亡 动态LCA: 可以用LCT维护或直接更新倍增数组 最后统计子树点的个数 坑: 我还不会序列型Toposort #include<iost ...

  6. 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA

    [BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...

  7. Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造

    Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...

  8. [洛谷P2597] [ZJOI2012]灾难

    洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...

  9. 1321. [ZJOI2012] 灾难

    1321. [ZJOI2012] 灾难 ★★☆   输入文件:catas.in   输出文件:catas.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 阿米巴是小强的 ...

随机推荐

  1. sql server存储过程相关

    1,创建存储过程 create proc proc_test with encryption[这里是对存储过程加密],如果存储过程不常用可以加with recompile[这样存储过程就不会放到缓存里 ...

  2. SQLServer排序时与读取的记录会影响到结果?

    这是在做程序的时候发现的,我用到了一个分页存储过程,在翻看第二页的时候发现结果竟然与第一页有很多重复的内容, 下面开始测试一下吧: 创建表 create table abc ( id int prim ...

  3. C#中ToString和Formate格式大全

    C#中ToString格式大全 stringstr1 =); //result: 56,789.0 stringstr2 =); //result: 56,789.00 stringstr3 =); ...

  4. Cisco模拟器使用和静态路由配置

    一. 模拟器使用 网络拓扑图 1. 模拟器搭建环境及网络结构 2. 使用ios系统加载并配置 3. 加载3745ios后计算pc值以减小cpu的消耗 4. 然后使用CTRL+]+i得到最大的一个值(如 ...

  5. php折线图 布局图

    例子1: 1 <?php require_once("../conf.php"); ?> <!DOCTYPE HTML> <html> < ...

  6. javascript笔记——jquery.each中使用continue和break的方式

    jQuery.each中continue的方式是 return  true  break 的方式是return false

  7. zip生成

    生成zip文件官方网站:http://www.phpconcept.net/pclzip/ 用法一: 1 <?php 2     include_once('pclzip.lib.php'); ...

  8. nginx服务器配置多域名

    nginx服务器支持配置多站点,我们可以通过配置子域名让你的一个域名下放置多个项目. 那么如何实现这个过程呢? 网络上的许多方案,有些写的过于繁杂,有些则是配置有误,或者说,有些配置项是要根据自己的主 ...

  9. Cookie 的运行机制以及常用规则

    一   setCookie        bool setcookie ( string name [, string value [, int expire [, string path [, st ...

  10. Mysql 正则获取字段的交集【转】

    问题描述 比如table1中有两条记录 name no a    2,9 b    8,10 然后有一串字符串,是0,1,2,3,4 然后通过一条sql,找出no为2,9的记录来``` 因为字符串中有 ...