洛谷题目链接:[ZJOI2012]灾难

题目描述

阿米巴是小强的好朋友。

阿米巴和小强在草原上捉蚂蚱。小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难。

学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统。如果蚂蚱灭绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾难。

我们现在从专业一点的角度来看这个问题。我们用一种叫做食物网的有向图来描述生物之间的关系:

一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连一个有向边。

这个图没有环。

图中有一些点没有连出边,这些点代表的生物都是生产者,可以通过光合作用来生存; 而有连出边的点代表的都是消费者,它们必须通过吃其他生物来生存。

如果某个消费者的所有食物都灭绝了,它会跟着灭绝。

我们定义一个生物在食物网中的“灾难值”为,如果它突然灭绝,那么会跟着一起灭绝的生物的种数。

举个例子:在一个草场上,生物之间的关系是:

如果小强和阿米巴把草原上所有的羊都给吓死了,那么狼会因为没有食物而灭绝,而小强和阿米巴可以通过吃牛、牛可以通过吃草来生存下去。所以,羊的灾难值是1。但是,如果草突然灭绝,那么整个草原上的5种生物都无法幸免,所以,草的灾难值是4。

给定一个食物网,你要求出每个生物的灾难值。

输入输出格式

输入格式:

输入文件 catas.in 的第一行是一个正整数 N,表示生物的种数。生物从 1 标

号到 N。

接下来 N 行,每行描述了一个生物可以吃的其他生物的列表,格式为用空

格隔开的若干个数字,每个数字表示一种生物的标号,最后一个数字是 0 表示列

表的结束。

输出格式:

输出文件catas.out包含N行,每行一个整数,表示每个生物的灾难值。

输入输出样例

输入样例#1:

5

0

1 0

1 0

2 3 0

2 0

输出样例#1:

4

1

0

0

0

说明

【样例说明】

样例输入描述了题目描述中举的例子。

【数据规模】

对50%的数据,N ≤ 10000。

对100%的数据,1 ≤ N ≤ 65534。

输入文件的大小不超过1M。保证输入的食物网没有环。


一句话题意: 给出一个食物链网络,当一个物种的所有食物都灭绝了这个物种才会灭绝,问一个物种灭绝后会使多少个物种灭绝.


题解: 首先可以确定处理顺序:一定要按照食物链的拓扑序来处理(从被吃的物种到吃它的物种),这样才能保证某一个物种灭绝后不会对它吃的物种造成影响.

那么在处理某个物种灭绝后造成的影响该怎么算呢?

不难想到暴力模拟,从每个点出发,直接拓扑序累加答案,这样的做法是\(O(n^2)\)的.可能有人会想到直接做一遍拓扑排序统计答案,但是这样的话就无法保证统计答案的时候某个物种的每一个食物都已经灭绝了,从而导致答案错误.

那么显然我们枚举每个点算答案的过程是不能省略的.那么该怎么样优化复杂度呢?

这里我们可以将已经算完答案的物种加入一颗树中,如果一个\(A\)灭绝后\(B\)也会灭绝,就将\(B\)连向\(A\)的儿子.这样建树的话统计答案就非常方便了,一个物种灭绝的答案就是它的子树大小.

但是这样还是有问题:一个物种可能要有多个物种灭绝才会灭绝.这时我们就可以求出这个物种所有的食物的\(LCA\),也就是说只有这个\(LCA\)灭绝了,这个物种才会灭绝.比如说这张图(引用自\(Lance1ot\)的贴图):

只有1灭绝了4才会灭绝,这样的话就将4接到1下面就可以了.

所以我们可以每次以拓扑序顺序向树中加点,并每次更新\(LCA\)的倍增数组(这里选用倍增求解\(LCA\)是因为倍增比较好在线统计,而树剖在建树的过程是离线的,也就是我们在处理之前并不知道树的形态).最后建好树后直接一遍\(dfs\)遍历整颗树.

#include<bits/stdc++.h>
using namespace std;
const int N = 300000+5; int n, val[N], gup[N][25], dep[N], in[N]; vector <int> food[N], top[N], ch[N]; int gi(){
int ans = 0, f = 1; char i = getchar();
while(i<'0' || i>'9'){ if(i == '-') f = -1; i = getchar(); }
while(i>='0' && i<='9') ans = ans*10+i-'0', i = getchar();
return ans * f;
} int lca(int x, int y){
if(dep[x] < dep[y]) swap(x, y);
for(int i=20;i>=0;i--)
if(dep[gup[x][i]] >= dep[y]) x = gup[x][i];
if(x == y) return x;
for(int i=20;i>=0;i--)
if(gup[x][i] != gup[y][i]) x = gup[x][i], y = gup[y][i];
return gup[x][0];
} void solve(int x){
int LCA = food[x][0];
for(int i=1;i<food[x].size();i++) LCA = lca(LCA, food[x][i]);
ch[LCA].push_back(x), dep[x] = dep[LCA]+1, gup[x][0] = LCA;
for(int i=1;i<=20;i++) gup[x][i] = gup[gup[x][i-1]][i-1];
} void topsort(){
queue <int> q;
for(int i=1;i<=n;i++)
if(in[i] == 0) in[i]++, top[0].push_back(i), food[i].push_back(0);
q.push(0);
while(!q.empty()){
int x = q.front(); q.pop();
for(int i=0;i<top[x].size();i++)
if(--in[top[x][i]] == 0) solve(top[x][i]), q.push(top[x][i]);
}
} void dfs(int x, int f){
for(int i=0;i<ch[x].size();i++)
dfs(ch[x][i], x), val[x] += val[ch[x][i]];
} int main(){
// freopen("data.in", "r", stdin);
ios::sync_with_stdio(false);
int x; n = gi();
for(int i=1;i<=n;i++){
x = gi();
while(x) in[i]++, top[x].push_back(i), food[i].push_back(x), x = gi();
}
for(int i=1;i<=n;i++) val[i] = 1;
topsort(), dfs(0, -1);
for(int i=1;i<=n;i++) cout << val[i]-1 << endl;
return 0;
}

[洛谷P2597] [ZJOI2012]灾难的更多相关文章

  1. 洛谷 P2597 [ZJOI2012]灾难 解题报告

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

  2. 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]

    题目传送门 灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. ...

  3. [bzoj2815] [洛谷P2597] [ZJOI2012] 灾难

    Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过 ...

  4. Solution -「ZJOI2012」「洛谷 P2597」灾难

    \(\mathcal{Description}\)   link.   给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.)   原图结点数 \ ...

  5. P2597 [ZJOI2012]灾难——拓扑,倍增,LCA

    最近想学支配树,但是基础还是要打好了的: P2597 [ZJOI2012]灾难 这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝: 求得就是一个点能支配几个点: 如果一个 ...

  6. [洛谷P2610] [ZJOI2012]旅游

    洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...

  7. 【洛谷 P2597】 [ZJOI2012]灾难(LCA)

    题目链接 考虑建一棵树,使一个生物灭绝时他的子树都会灭绝,显然这样答案就是以每个点为根的子树大小-1. 为什么原图不是一棵树,因为一个生物可能会以多个生物为食,所以按拓扑序来建树,把每个遍历到的点的父 ...

  8. 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告

    P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...

  9. P2597 [ZJOI2012]灾难

    \(\color{#0066ff}{ 题目描述 }\) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝, ...

随机推荐

  1. C Program基础-宏定义

    写好c语言,漂亮的宏定义是非常重要的,我们在阅读别人工程时,往往能看到大量的宏定义,宏定义可以增加代码的可读性,也能增加代码的可移植性,一个好的宏定义甚至是一件艺术品.今天我们就来看看宏定义的方方面面 ...

  2. iostat lsof

    转至:http://www.51testing.com/html/48/202848-242043.html 命令总结: 1. top/vmstat 发现 wa%过高,vmstat b >1: ...

  3. Alpha发布-----欢迎来怼团队

    欢迎来怼项目小组—Alpha发布展示 一.小组成员 队长:田继平 成员:葛美义,王伟东,姜珊,邵朔,冉华 ,李圆圆 二.文案+美工展示 链接:http://www.cnblogs.com/wwd199 ...

  4. 福大软工1816:Alpha(5/10)

    Alpha 冲刺 (5/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.忙于复习,本次无成果 展示 ...

  5. ACM 第十二天

    博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈,SG函数,SG定理) 一.  巴什博奕(Bash Game): A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30.这应该是最古老的关 ...

  6. 什么是RESTFUL协议?

    1,restful是Representational State Transfer的缩写,翻译过来是表现层状态转移.我的理解是去掉访问文件的格式,比如去掉文件为html的.html,而是采用路径的方式 ...

  7. BAT批处理(五)

    批处理程序 一.交互界面设计 没啥说的,看看设计的菜单界面吧:@echo offclstitle 终极多功能修复:menuclscolor 0Aecho.echo ================== ...

  8. tcp中的发送窗口是啥意思?

    初始的三次握手: 02:52:36.585412 IP 127.0.0.1.59764 > 127.0.0.1.8000: Flags [S], seq 3800457532, win 4369 ...

  9. Spring MVC架构浅析

    阅读目录 Spring MVC概述 Spring MVC框架的特点 Spring MVC工作原理 Spring MVC概述 Spring的web框架围绕DispatcherServlet设计,Disp ...

  10. asp.net MVC 导出查询结果到Excel

    首先在View视图中有一表单form,导出按钮<input class="btn export" type="button" value="导出 ...