对于一个食物网(一个DAG),一个物种死亡后,某些物种就必然死亡,求出必然死亡的是那些物种。

灭绝树的另一种含义是:“灭绝树跟节点到节点u的路径上的节点由那些原图中从根节点到节点u的所有路径中都经过了的点“。

 /**************************************************************
Problem: 2815
User: idy002
Language: C++
Result: Accepted
Time:424 ms
Memory:14036 kb
****************************************************************/ #include <cstdio>
#include <vector>
#define maxn 65544
#define maxp 17
using namespace std; int n;
vector<int> g[maxn], vg[maxn], gg[maxn];
int indgr[maxn], topo[maxn], topo_cnt;
int anc[maxn][maxp+], depth[maxn];
int siz[maxn]; void make_topo() {
vector<int> stk;
for( int i=; i<=n; i++ )
if( indgr[i]== ) stk.push_back(i);
while( !stk.empty() ) {
int u = stk.back();
topo[++topo_cnt] = u;
stk.pop_back();
for( int t=; t<g[u].size(); t++ ) {
int v = g[u][t];
indgr[v]--;
if( indgr[v]== ) stk.push_back(v);
}
}
} int lca( int u, int v ) {
if( depth[u]<depth[v] ) swap(u,v);
int t = depth[u]-depth[v];
for( int i=; t; t>>=,i++ )
if( t& ) u=anc[u][i];
if( u==v ) return u;
for( int p=maxp; p>=&&anc[u][]!=anc[v][]; p-- )
if( anc[u][p]!=anc[v][p] ) u=anc[u][p], v=anc[v][p];
return anc[u][];
} void dfs( int u ) {
siz[u] = ;
for( int t=; t<gg[u].size(); t++ ) {
int v = gg[u][t];
dfs(v);
siz[u] += siz[v];
}
} void work() {
make_topo();
for( int i=; i<=n; i++ ) {
anc[i][] = i;
depth[i] = ;
}
for( int i=; i<=n; i++ ) {
int u = topo[i];
if( vg[u].size()== ) continue;
int ca = vg[u][];
for( int t=; t<vg[u].size(); t++ ) {
int v = vg[u][t];
ca = lca(ca,v);
}
gg[ca].push_back(u);
anc[u][] = ca;
depth[u] = depth[ca]+;
for( int p=; p<=maxp; p++ )
anc[u][p] = anc[anc[u][p-]][p-];
}
dfs(n);
for( int i=; i<=n-; i++ )
printf( "%d\n", siz[i]- );
} int main() {
scanf( "%d", &n );
for( int v=,u; v<=n; v++ ) {
while() {
scanf( "%d", &u );
if( u== ) break;
g[u].push_back(v);
vg[v].push_back(u);
indgr[v]++;
}
}
for( int u=; u<=n; u++ )
if( indgr[u]== ) {
g[n+].push_back(u);
vg[u].push_back(n+);
indgr[u]++;
}
n++;
work();
}

bzoj 2815 灭绝树的更多相关文章

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

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

  2. 灾难 bzoj 2815

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

  3. BZOJ 2815: [ZJOI2012]灾难

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

  4. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  5. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  6. codeforces 757F - 最短路DAG+灭绝树

    Description 给定一个n个点,m条边的带权无向图,和起点S.请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变. Solution 先建出最短路DAG,在 ...

  7. [BZOJ 4771]七彩树(可持久化线段树+树上差分)

    [BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...

  8. bzoj 2815 灾难

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

  9. BZOJ 3531(树链剖分+线段树)

    Problem 旅行 (BZOJ 3531) 题目大意 给定一颗树,树上的每个点有两个权值(x,y). 要求维护4种操作: 操作1:更改某个点的权值x. 操作2:更改某个点的权值y. 操作3:求a-- ...

随机推荐

  1. 43、os和sys模块的作用?

    os与sys模块的官方解释如下: os:这个模块提供了一种方便的使用操作系统函数的方法. sys:这个模块可供访问由解释器使用或维护的变量和与解释器进行交互的函数. 总结:os模块负责程序与操作系统的 ...

  2. python作业员工信息表程序(第四周)

    作业需求: 1. 员工信息表程序,实现增删改查操作: 2. 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 ...

  3. SQL server(到主机的TCPIPl连接失败的问题)

    1 首先要做的是在sql新建查询里输入 exec sys.sp_readerrorlog 0, 1, 'listening' 运行后 会显示你的sql 正在运行的tcp/ip接口 看看是否和你java ...

  4. perl6正则 4: before / after 代码断言: <?{}> / <!{}>

    <?before> <? befor XXX> 某字符在 xxx 之前 <?after > <?after XXX> 某字符之后有XXX 对应的取反分别 ...

  5. Python3 断言

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:CarsonLi ''' 断言一般用于后面有非常重要的操作,需要使用前面的数据,而且不容许出 ...

  6. Delphi 10 seattle 去掉自带的代码连接线

  7. elk系列3之通过json格式采集Nginx日志【转】

    转自 elk系列3之通过json格式采集Nginx日志 - 温柔易淡 - 博客园http://www.cnblogs.com/liaojiafa/p/6158245.html preface 公司采用 ...

  8. Loadrunner脚本学习总结

    1.1      web脚本录制选择Web(HTTP/HTML)协议: 注意录制脚本前选择如下协议: 1.2      脚本如果需要使用如下函数: web_reg_save_param.web_fin ...

  9. u-boot界面添加命令[demo]

    目标板:2440 如何在u-boot界面中增加命令 在/common/目录下建立文件,调用执行函数do_bootm就行,然后在修改Makefile,就OK了. 比如在u-boot界面添加命令test ...

  10. GDB调试实用命令

    个人感觉从windows平台转到linux平台一个不适应的地方就是调试器的使用.因为windows下调试器基本上都依赖快捷键和图像界面来完成操作,就算是windbg这种伪命令行的工具,命令也很简单比较 ...