首先假设我们定义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. string 类的实现

    . #include<iostream> . #include<iomanip> . using namespace std; . . class String{ . frie ...

  2. Android Parcelable和Serializable的区别,androidparcelable

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

  3. 13SpringMvc_限定某个业务控制方法,只允许GET或POST请求方式访问

    这篇文章要实现的功能是:在一个Action中,有些业务方法只能是post提交上来的才能执行,有些方法是只能get提交上来的才能执行. 比如上篇文章中的UserAction.java(代码如下) pac ...

  4. 【MySQL】Linux MySQL学习记录

    1.查看日志存放路径 show variables like 'general_log_file'; 2.查看日志是否开启 show global variables like 'log_bin%'; ...

  5. Silverlight OOB程序签名问题

    浏览器外部署Silverlight时,为了让部署到本地的Silverlight应用程序保持最新,通常需要在应用程序中添加更新检查的功能.具体实现可参见这儿. 除了文中提到的“应用程序中使用了用户尚未安 ...

  6. PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法

    擦,一身盗汗.一向的设计信息都在设计图里!竟然坏了,坏了!!!!! 惊.怒.悲 固然可以经由过程数据库当前状况反向工程.然则那么注解.我写的提示这些器材都邑消散. 比来的备份是10天前,恢复也会有必然 ...

  7. MVC出错案例之一:主外键映射失败

    今天在编写DomainModel和DomainMapper,最后放到OnModelCreating中运行的时候,给我抛出了如下错误: One or more validation errors wer ...

  8. Linux操作系统里查看所有用户

    Xwindows界面的就不说了. 1.Linux里查看所有用户 linux里,并没有像windows的net user,net localgroup这些方便的命令来管理用户. (1)在终端里.其实只需 ...

  9. Android nDrawer

    GitHub上一款流行的侧滑,附上自己as编译过的源码http://download.csdn.net/detail/lj419855402/8559039. 留个纪念,说不定以后用得到. 依赖一个l ...

  10. Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)

    Mina:Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用 ...