好像很久之前就看过这道题,大概是刚学\(LCA\)的时候

之后当时肯定是不会的呀

现在发现这道题并不是非常难

首先我们发现这个灭绝的关系非常像一棵树,我们建出这个灭绝树求一个前缀和就可以啦

那么应该怎么建这棵树呢

我们一边拓扑排序一边建树,一个点的父亲应该是其所有食物节点的\(lca\),于是一边拓扑排序一边求\(lca\)就好了

手滑了好几次

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define re register
#define maxn 70005
struct Edge
{
int v,nxt;
}e[200005];
int head[maxn];
int num,n;
inline void add_edge(int x,int y)
{
e[++num].v=y;
e[num].nxt=head[x];
head[x]=num;
}
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int deep[maxn],f[maxn][18];
namespace Topsort
{
struct E
{
int v,nxt;
}e[200005];
int num,head[maxn],r[maxn],q[maxn];
int fa[maxn];
inline void add(int x,int y)
{
e[++num].v=y;
e[num].nxt=head[x];
head[x]=num;
}
inline int LCA(int x,int y)
{
if(deep[x]<deep[y]) std::swap(x,y);
for(re int i=17;i>=0;--i)
if(f[x][i]!=-1&&deep[f[x][i]]>=deep[y]) x=f[x][i];
if(x==y) return x;
for(re int i=17;i>=0;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
inline void init()
{
n=read();
int x;
for(re int i=1;i<=n;i++)
{
x=read();
while(x) add(x,i),r[i]++,x=read();
}
for(re int i=1;i<=n;i++)
if(!r[i]) add(0,i),r[i]++;
int tot=0;
q[++tot]=0;
memset(f,-1,sizeof(f));
memset(fa,-1,sizeof(fa));
for(re int i=1;i<=tot;i++)
{
for(re int j=head[q[i]];j;j=e[j].nxt)
{
r[e[j].v]--;
if(fa[e[j].v]==-1) fa[e[j].v]=q[i];
else fa[e[j].v]=LCA(fa[e[j].v],q[i]);
if(!r[e[j].v])
{
add_edge(fa[e[j].v],e[j].v);
deep[e[j].v]=deep[fa[e[j].v]]+1;
f[e[j].v][0]=fa[e[j].v];
for(re int k=1;k<=17;k++)
f[e[j].v][k]=f[f[e[j].v][k-1]][k-1];
q[++tot]=e[j].v;
}
}
}
}
}
int sz[maxn];
void dfs(int x)
{
sz[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
if(deep[e[i].v]>deep[x])
{
deep[e[i].v]=deep[x]+1;
dfs(e[i].v);
sz[x]+=sz[e[i].v];
}
}
int main()
{
Topsort::init();
dfs(0);
for(re int i=1;i<=n;i++)
printf("%d\n",sz[i]-1);
return 0;
}

【[ZJOI2012]灾难】的更多相关文章

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

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

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

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

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

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

  4. 1321. [ZJOI2012] 灾难

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

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

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

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

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

  7. BZOJ 2815: [ZJOI2012]灾难

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

  8. BZOJ2815: [ZJOI2012]灾难

    传送门 学LCA的时候根本没意识到LCA可以有这么多玩法. 这玩意据说是个高级数据结构(支配树)的弱化版,蒟蒻没学过呀.所以出题人提出一个概念叫灾难树. 我理解的灾难树的意思实际上是属于DAG的一个子 ...

  9. 2815: [ZJOI2012]灾难 - BZOJ

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

  10. [ZJOI2012]灾难(建图)

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

随机推荐

  1. Java基础教程(7)--运算符

      现在,我们已经学会了如何声明和初始化变量,但你可能想知道如何操作它们.运算符是对一个,两个或三个操作数执行特定操作并返回结果的特殊符号.下表列出了Java中的运算符:   表格中的运算符是按照从上 ...

  2. MyBatis别名

    Spring的别名管理比较规范,有严格的接口规范,SimpleAliasRegistry实现 -> AliasRegistry接口,而且是线程安全的,Map也用的是ConcurrentHashM ...

  3. 从Linux系统安装到Web应用启动教程

    概述 本文讲述web应用服务器安装配置教程,其中包括:Linux系统安装,Mysql数据库安装配置,Redis安装配置,Tomcat安装配置,MongoDB安装配置,Linux JDK安装使用,Ngi ...

  4. src/main/resources文件夹

    Error starting ApplicationContext. To display the auto-configuration report re-run your application ...

  5. MySQL 索引知识总结

    将 mysql 的索引以书本的索引类比比较贴切,要找到一个关键字为xxx 的条目,首先翻到索引中查找有哪些页码涉及到,无疑就缩小了范围.在这个小范围内再寻找符合条件的数据,效率就会提高许多. mysq ...

  6. IniHelper——INI操作辅助类

    使用INI配置文件,简单便捷. 该辅助工具类为C#操作INI文件的辅助类,源码在某位师傅的基础上完善的来,因为忘记最初的来源了,因此不能提及引用,在此深感遗憾,并对贡献者表示感谢. using Sys ...

  7. SQL Server 中位数、标准差、平均数

    create table examines ( ,) NOT NULL, ) NULL, [ph_score] [int] NULL ) SELECT dept_name, AVG(sp) as '中 ...

  8. Node.js学习(篇章一)

    <node.js的特点> 采用了异步式I/O与事件驱动的架构设计,架构为单线程模型. <supervisor包的作用> node.js开发项目,当修改项目时,需要终止进程重启N ...

  9. MathQuill.js

    MathQuill.js通过html.css.javascript实现数学公式 <p>Type math here: <span id="math-field"& ...

  10. RocketMQ读书笔记6——可靠性优先的使用场景

    [顺序消息] 顺序消费是指消息的产生顺序和消费顺序相同. 比如订单的生成.付款.发货,这三个消息必须按顺序处理才可以. [顺序消息的分类] 全局顺序消息和部分顺序消息. 上面订单的例子,其实是部分顺序 ...