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

  我们将出度数为0的节点的父亲节点定义为0,那么我们可以发现,某个点的父亲节点就是他所有儿子的父亲节点的lca。

  备注:lca写错了,查了半天。

//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
#define maxm 2000100 using namespace std; int n;
int pre[maxm][],last[maxn][],other[maxm][],cnt[maxn],l[];
int que[maxn],dep[maxn],size[maxn];
int jump[maxn][]; int lca(int x,int y) {
//if ((!x)||(!y)) return x+y;
//printf("fuck %d %d\n",x,y);
if (dep[x]>dep[y]) swap(x,y);
int det(dep[y]-dep[x]);
for (int j=;j<=;j++) if (det&(<<j)) y=jump[y][j];
//printf("%d\n",y);
if (x==y) return x;
for (int j=;j>=;j--) if (jump[x][j]!=jump[y][j]) x=jump[x][j],y=jump[y][j];
return jump[x][];
} void connect(int x,int y,int cur) {
if (((!y)||(!x))&&(cur!=)) return ;
pre[++l[cur]][cur]=last[x][cur];
last[x][cur]=l[cur];
other[l[cur]][cur]=y;
if (!cur) cnt[x]++;
//if (cur==2) printf("|%d %d\n",x,y);
} void dfs(int x) {
size[x]=;
for (int p=last[x][];p;p=pre[p][]) {
dfs(other[p][]);
size[x]+=size[other[p][]];
}
} int main() {
scanf("%d",&n);
for (int i=;i<=n;i++) {
int x();
while (x) scanf("%d",&x),connect(i,x,),connect(x,i,);
}
int h(),t();
//for (int i=1;i<=n;i++) printf("%d ",cnt[i]); printf("\n");
for (int i=;i<=n;i++) if (!cnt[i]) que[++t]=i;
while (h<t) {
int cur(que[++h]);
for (int p=last[cur][];p;p=pre[p][]) {
cnt[other[p][]]--;
if (!cnt[other[p][]]) {
que[++t]=other[p][];
}
}
}
//for (int i=1;i<=n;i++) printf("%d %d %d\n",i,que[i],dep[i]); printf("\n");
memset(dep,,sizeof dep);
dep[]=;
for (int i=;i<=n;i++) {
int cur(que[i]);
jump[cur][]=other[last[cur][]][];
for (int p=pre[last[cur][]][];p;p=pre[p][]) jump[cur][]=lca(jump[cur][],other[p][]);
//printf("|%d %d\n",cur,jump[cur][0]);
connect(jump[cur][],cur,); dep[cur]=dep[jump[cur][]]+;
for (int j=;j<=;j++) jump[cur][j]=jump[jump[cur][j-]][j-];
}
//printf("%d\n",lca(0,5));
//for (int i=1;i<=n;i++) printf("%d ",jump[i][0]); printf("\n");
dfs();
for (int i=;i<=n;i++) printf("%d\n",size[i]-);
return ;
}

bzoj 2815 灾难的更多相关文章

  1. 灾难 bzoj 2815

    灾难(1s 128MB)catas [样例输入] 5 0 1 0 1 0 2 3 0 2 0 [样例输出] 4 1 0 0 0 题解: 主要算法:拓扑排序:最近公共祖先(Lca): 先跑出拓扑序 我们 ...

  2. BZOJ 2815: [ZJOI2012]灾难

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

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

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

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

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

  5. bzoj 2815 灭绝树

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

  6. bzoj 2815

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

  7. BZOJ2815: [ZJOI2012]灾难

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

  8. Luogu 2597 [ZJOI2012]灾难

    BZOJ 2815. 解法还是挺巧妙的. 放上写得很详细很好懂的题解链接  戳这里. 一个物种$x$如果要灭绝,那么沿着它的入边反向走走走,一定可以走到一个点$y$,如果这个点$y$的物种灭绝了,那么 ...

  9. 2815: [ZJOI2012]灾难 - BZOJ

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

随机推荐

  1. HDU 1171 Big Event in HDU --暴力+生成函数

    题意:给n种房子,每种房子有一个值val和个数cnt,现在要把这些房子分成两部分,争取两部分总值相等,如果不能相等,让A>B,且A-B最小. 解法:先跑一次生成函数,c[n]表示组成总值为n的方 ...

  2. AutoIT简介

    AutoIT最初是为了帮助IT管理和维护而开发的工具,能自动完成软件的安装.由于自动化安装和自动化测试在功能需求上有许多相似之处,都要模拟用户对软件进行操作,并验证执行的结果,所以,AutoIT逐渐成 ...

  3. Linux命令学习-top

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 01:06:48 up  1:22,   ...

  4. Watir、Selenium2、QTP区别

    1.支持的语言 Watir:ruby Selenium2:支持多种语言,如:python,ruby,java,c#,php,perl,javascript QTP:vbscript 2.支持的浏览器 ...

  5. 学员信息录入(StuInfoManager) 用分层实现(既MySchool后的一个案例)

    数据库 数据表名 Student 中文表名 学员信息表 字段显示 字段名 数据类型 字段大小 备注和说明 编号 stu_id int 主键,自增1 学生姓名 stu_name varchar 50 不 ...

  6. 日期选择器:jquery datepicker的使用

    helloweba.com 作者:月光光 时间:2012-04-08 21:05 标签: jquery  datepicker  jquery ui     在jquery ui中,提供了一个非常实用 ...

  7. intellij IDEA15 设置背景颜色

    File--> Settings 2. Appearance & Behavior --> Appearance 设置边框背景颜色 3. Editor --> Colors ...

  8. JqueryMobile入门基础附源码下载

    最近要做一个手机版的网站,所以就了解了一点JqueryMObile,下面是我整理的笔记,现在分享给大家,希望朋友们喜欢,先给个首页看看吧!!! 一.JqueryMobile基本页面结构 <!DO ...

  9. Linux 网络编程二(Socket创建)

    TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...

  10. Linux 进程通信(共享内存区)

    共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也 ...