灾难

【样例输入】

5

0

1 0

1 0

2 3 0

2 0

【样例输出】

4

1

0

0

0


题解:

先跑出拓扑序

我们按拓扑序建立一棵“灭绝树”

灭绝树含义是当一个点灭绝时,它的子树将会全部灭绝

所以答案就是点在灭绝树中的子树大小

一个点如果灭绝,那么需要所有指向它的点灭绝

由于拓扑序的关系,指向它的点已经加入过了"灭绝树”中

所以这个点要灭绝,就需要所有指向它的点全部灭绝,即这些点的最近公共祖先

那么直接我们将这个祖先与此点连边,更新Lca

最后求出子树大小,即统计答案

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
inline int Get()
{
int x = ;
char c = getchar();
while('' > c || c > '') c = getchar();
while('' <= c && c <= '')
{
x = (x << ) + (x << ) + c - '';
c = getchar();
}
return x;
}
const int me = ;
int n;
int head, tail;
int in[me];
int ue[me];
int de[me];
int si[me];
int fat[me][];
int tot, nex[][me], fir[][me], to[][me];
inline void Ins(int x, int y, int z)
{
nex[z][++tot] = fir[z][x];
fir[z][x] = tot;
to[z][tot] = y;
}
inline void Topo()
{
head = , tail = ;
for(int i = ; i <= n; ++i)
if(!in[i])
ue[++tail] = i;
while(head < tail)
{
int u = ue[++head];
for(int i = fir[][u]; i; i = nex[][i])
{
int v = to[][i];
--in[v];
if(!in[v]) ue[++tail] = v;
}
}
}
inline int Lca(int x, int y)
{
if(x < ) return y;
if(de[x] < de[y]) swap(x, y);
for(int i = ; i >= ; --i)
if(de[fat[x][i]] >= de[y])
x = fat[x][i];
for(int i = ; i >= ; --i)
if(fat[x][i] != fat[y][i])
{
x = fat[x][i];
y = fat[y][i];
}
if(x == y) return x;
return fat[x][];
}
inline void Update(int u, int v)
{
fat[v][] = u;
de[v] = de[u] + ;
for(int i = ; i <= ; ++i)
fat[v][i] = fat[fat[v][i - ]][i - ];
}
inline void Build()
{
while(tail)
{
int u = ue[tail];
int lca = -;
for(int i = fir[][u]; i; i = nex[][i])
{
int v = to[][i];
lca = Lca(lca, v);
}
if(lca < ) lca = ;
Ins(lca, u, );
Update(lca, u);
--tail;
}
}
void Ergo(int u)
{
si[u] = ;
for(int i = fir[][u]; i; i = nex[][i])
{
int v = to[][i];
Ergo(v);
si[u] += si[v];
}
}
int main()
{
n = Get();
for(int i = ; i <= n; ++i)
{
int x = Get();
while(x)
{
++in[x];
Ins(i, x, );
x = Get();
}
}
Topo();
Build();
Ergo();
for(int i = ; i <= n; ++i)
printf("%d\n", si[i] - );
}

灾难 bzoj 2815的更多相关文章

  1. BZOJ 2815: [ZJOI2012]灾难

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

  2. bzoj 2815 灾难

    首先假设我们定义x灭绝后y会灭绝,那么离y最近的x就为y的父亲节点,那么如果我们可以求出每个节点的父亲节点,我们就得到了一棵树,然后每个节点的灾难值就是子树的大小-1. 我们将出度数为0的节点的父亲节 ...

  3. 2815: [ZJOI2012]灾难 - BZOJ

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

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

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

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

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

  6. bzoj 2815 灭绝树

    对于一个食物网(一个DAG),一个物种死亡后,某些物种就必然死亡,求出必然死亡的是那些物种. 灭绝树的另一种含义是:“灭绝树跟节点到节点u的路径上的节点由那些原图中从根节点到节点u的所有路径中都经过了 ...

  7. Day10 - 灾难 HYSBZ - 2815

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

  8. bzoj 2815

    http://www.cnblogs.com/JS-Shining/archive/2013/01/12/2857429.html 题面 题解上写了用什么dominator tree,吓晕了,看了看, ...

  9. BZOJ2815: [ZJOI2012]灾难

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

随机推荐

  1. Objective-C枚举的几种定义方式与使用

    假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateC ...

  2. javaScript之BOM操作1

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 自定义鼠标光标cursor

    通过css属性 Cursor:url()自定义鼠标光标. {cursor:url('图标路径'),default;} url是自定义鼠标图标路径 default指的是定义默认的光标(通常是一个箭头), ...

  4. D3.js学习(六)

    上节我们学习了如何绘制多条曲线, 以及给不同的曲线指定不同的坐标系.在这节当中,我们会对坐标轴标签相关的处理进行学习.首先,我们来想一个问题, 如何我们的x轴上的各个标签的距离比较近,但是标签名又比较 ...

  5. smartcrop.js智能图片裁剪库

    今天将为大家介绍一款近期github上很不错的开源库 – smartcrop.js.它是一款图片处理的智能裁剪库.在很多项目开发中,经常会遇见上传图片的场景,它可能是用户照片信息,也可能是商品图片等. ...

  6. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  7. Spark笔记:复杂RDD的API的理解(下)

    本篇接着谈谈那些稍微复杂的API. 1)   flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...

  8. ValueInjecter----最好用的OOM(以微信消息转对象举例)

    使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个oom的使用,还是很有必要的. 这种类型的工具有很多,比如automapper, ...

  9. 「标准」的 JS风格

    首先,这份 JS风格指南已经在我司的前端团队实行半年多了: 其次,在程序员的世界里,从入行到资深都需要面对几个世界级的难题,如: 世界上最好的编辑器是什么? 是用空格还是 TAB?用空格还特么衍生出 ...

  10. 牛顿插值法——用Python进行数值计算

    拉格朗日插值法的最大毛病就是每次引入一个新的插值节点,基函数都要发生变化,这在一些实际生产环境中是不合适的,有时候会不断的有新的测量数据加入插值节点集, 因此,通过寻找n个插值节点构造的的插值函数与n ...