题目描述 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. Swiper之滑块3

    上章Swiper滑块2.Swiper滑块1都是手动的,这章我们来自动的! 其实只是加了Swiper的speed(滑动速度即slider自动滑动开始到结束的时间)属性而已(∩_∩),单位是ms < ...

  2. asp.net在网页上显示数据库中的数据

    第一步: 第二步: 第三步: 第四步:在网页代码中写显示格式代码,如下 <asp:SqlDataSource ID="SqlDataSource1" runat=" ...

  3. byte[] 清空

    1. using(byte buff = new byte[Size]){  // 你要用的代码,} 2. Array.Clear(bytes, 0 ,bytes.Length);

  4. .NET使用QRCodeEncoder生成二维码

    ThoughtWorks.QRCode.dll版本 1.0.2774.19990 代码如下: /// <summary> /// 生成二维码图片 /// </summary> ...

  5. 【学习笔记】【C语言】变量

    1. 什么是变量 当一个数据的值需要经常改变或者不确定时,就应该用变量来表示.比如游戏积分. 2. 定义变量 1> 目的 任何变量在使用之前,必须先进行定义. 定义变量的目的是:在内存中分配一块 ...

  6. UI1_UICollectionView

    // AppDelegate.m // UI1_UICollectionView // // Created by zhangxueming on 15/7/16. // Copyright (c) ...

  7. Ajax_2

    <script> var xmlHttp;//创建一个对象 function queryDetail(id){ if(window.ActiveXObject){ xmlHttp = ne ...

  8. JavaScript之字符串

    一.声明方式 1. 直接赋值 var str = 'hello javascript'; 2. 构造函数 var str2 = new String('hello world'); 这两种有什么区别呢 ...

  9. JavaScript学习笔记 -- 带参数arguments的函数的用法

    JavaScript函数有带参数与不带参数两种形式,不带参数情况如下: function myFunction() { alert('HelloWorld!') } 在这种类型的函数中,输出值是确定的 ...

  10. 9款基于HTML5/SVG/Canvas的折线图表应用

    1.华丽的HTML5图表 可展示实时数据 HTML5在图表应用中也十分广泛,比起以前的网页图表,HTML5图表制作更便捷,功能更强大.这款HTML5图表插件外观十分华丽和专业,在数据展示方面也很有优势 ...