对于一个食物网(一个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. [\u4e00-\u9fa5] //匹配中文字符

     [\u4e00-\u9fa5] //匹配中文字符 ^[1-9]\d*$    //匹配正整数^[A-Za-z]+$   //匹配由26个英文字母组成的字符串^[A-Z]+$      //匹配由26 ...

  2. 使用Bash时的几点总结

    作为一个天天与Linux打交道,并以此为生的Linux运维工程师,最常用的工具性语言恐怕就是shell了, 而对于大多数的Linux和一些类Unix而言,其默认的shell就是Bash.使用Bash一 ...

  3. 设置网卡IP,还每次都挨个地址输入吗?批处理一下【转】

    1.设置网卡ip,子网掩码和默认网关,注意修改网卡名称,跟本地连接汇总的网卡名称保持一直 netsh interface ip set address "以太网" static 1 ...

  4. 苹果的浏览器safari无法识别 2016-1-1这样的日期,会返回Invalid Date

    1.很多时候我们遇到的日期是2016-1-1这样的,中间是带横线的,但是有时候我们需要转化为标准的时间,即使用new Date(time)这样的方法,这时在safari浏览器里面Invalid Dat ...

  5. spring集成swagger

    随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染.前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远. 前端和后端的唯一联系,变成了API接口:API文档变成了 ...

  6. 以太坊go-ethereum项目源码本地环境搭建

    如果要深入了解go-ethereum项目的实现与机制,看源代码是必不可少的.今天这篇博客就简单介绍一下如何在本地搭建项目的开发环境. GO语言环境搭建 以win8为例,访问地址https://gola ...

  7. C++的一大误区——深入解释直接初始化与复制初始化的区别

      转自:http://blog.csdn.net/ljianhui/article/details/9245661 不久前,在博客上发表了一篇文章——提高程序运行效率的10个简单方法,对于其中最后一 ...

  8. hadoop环境安装及错误总结

    历时N天的hadoop环境,终于配好了 主要参考 Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS 1.开机默认进入字符界面或者是图形界面:http://blog.cs ...

  9. pdb-不需要IDE也能调试

    python中有个pdb模块,使python代码也可以像gdb那样进行调试,一般情况下pdb模块可以在代码内直接使用,也可以通过命令行参数的形式添加该模块进行调试(python -m pdb file ...

  10. bzoj 1816 二分

    思路:二分答案,然后我们贪心地先不填最小的一堆,看在最小的一堆消耗完之前能不能填满其他堆. #include<bits/stdc++.h> #define LL long long #de ...