\(\mathcal{Description}\)

  link.

  给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源。(一些名词与生物学的定义相同 w。)

  原图结点数 \(n\le65534\),边数 \(m\le10^6\),图保证无有向环。

\(\mathcal{Solution}\)

  支配树板题。将原图反向建边,令一个“超级生产者”结点,指向所有生产者,然后求出该图的支配树。每个物种的答案就是其子树大小 \(-1\)。

  以下会讲解对于有向无环图(DAG),如何建出支配树。

在 DAG 上建支配树

  声明对“支配”的定义:对于 \(u\) 的支配点 \(v\),满足删去 \(v\) 后,从源点不可到达 \(u\)。

  最近支配点:所有支配 \(u\) 的 \(v\) 中距离 \(u\) 最近的一个点。可以证明某个点的最近支配点唯一。

  按照拓扑序,从源点开始处理。可以直观地发现,点 \(u\) 的最近支配点就是其所有前驱结点在支配树上的 LCA。所以只需要每次向支配树加入当前结点,并处理处当前结点的倍增信息即可。

\(\mathcal{Code}\)

#include <queue>
#include <cstdio>
#include <vector> #define adj( g, u, v ) \
for ( int _eid = g.head[u], v; v = g.to[_eid], _eid; _eid = g.nxt[_eid] ) const int MAXN = 65534, MAXM = 1e6, MAXLG = 15;
int n, dep[MAXN + 5], ans[MAXN + 5], rnk[MAXN + 5], fa[MAXN + 5][MAXLG + 5];
std::queue<int> que;
std::vector<int> pre[MAXN + 5]; inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
} struct Graph {
int ecnt, head[MAXN + 5], to[MAXM + 5], nxt[MAXM + 5], ind[MAXN + 5];
inline void link ( const int s, const int t ) {
++ ind[to[++ ecnt] = t], nxt[ecnt] = head[s], head[s] = ecnt;
pre[t].push_back ( s );
}
} sour, domt; inline int LCA ( int u, int v ) {
if ( dep[u] < dep[v] ) u ^= v ^= u ^= v;
for ( int i = 15; ~ i; -- i ) if ( dep[fa[u][i]] >= dep[v] ) u = fa[u][i];
if ( u == v ) return u;
for ( int i = 15; ~ i; -- i ) if ( fa[u][i] ^ fa[v][i] ) u = fa[u][i], v = fa[v][i];
return fa[u][0];
} inline void calc ( const int u ) {
ans[u] = 1;
adj ( domt, u, v ) calc ( v ), ans[u] += ans[v];
} int main () {
n = rint ();
for ( int i = 1, t; i <= n; ++ i ) while ( t = rint () ) sour.link ( t, i );
for ( int i = 1; i <= n; ++ i ) if ( ! sour.ind[i] ) sour.link ( n + 1, i );
int cnt = 0;
que.push ( n + 1 );
for ( int u; ! que.empty (); que.pop () ) {
rnk[++ cnt] = u = que.front ();
adj ( sour, u, v ) if ( ! -- sour.ind[v] ) que.push ( v );
}
for ( int i = 1; i <= cnt; ++ i ) {
int u = rnk[i], f = 0;
if ( ! pre[u].empty () ) f = pre[u][0];
for ( int j = 1; j < ( int ) pre[u].size (); ++ j ) f = LCA ( f, pre[u][j] );
dep[u] = dep[fa[u][0] = f] + 1, domt.link ( f, u );
for ( int j = 1; j <= 15; ++ j ) fa[u][j] = fa[fa[u][j - 1]][j - 1];
}
calc ( n + 1 );
for ( int i = 1; i <= n; ++ i ) printf ( "%d\n", ans[i] - 1 );
return 0;
}

Solution -「ZJOI2012」「洛谷 P2597」灾难的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  3. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  4. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  5. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  6. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  7. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  8. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  9. 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】

    题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...

随机推荐

  1. Maven自定义jar包名

    一.默认命名 <finalName>${project.artifactId}-${project.version}</finalName> 二.自定义包名 <build ...

  2. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  3. IDEA超级好用的插件推荐

    IDEA超级好用的插件推荐 以下都是本人使用idea开发以来,所使用过的插件,强烈推荐,提升代码质量,事半功倍之首选!!! 先介绍下如何安装这些插件:(本人使用idea的版本是2020.2.3) 1. ...

  4. 【hexo指南】hexo配置ER图流程图时序图插件

    偏技术的文章有时会用到各种图形,一般来说可以做好图然后截图放到文章中就好了,虽然但图片本身也很小,但存一大堆图片占用空间总觉得不是很好. mermaid mermaid官方网站 mermaid支持很多 ...

  5. system (color XX )函数详解:调整控制台颜色的命令

    1.指定控制台输出的颜色属性 2.颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景.每个数字可以为以下任何值之一: 例如: "COLOR fc" 在亮白色上产生亮 ...

  6. Julia语言介绍

    官网:https://julialang.org/ 中文社区:https://cn.julialang.org/ Julia 是一个面向科学计算的高性能动态高级程序设计语言. 首先定位是通用编程语言, ...

  7. Android Sensor.TYPE_STEP_COUNTER 计步器传感器 步数统计

    注意:使用 计步器传感器 Sensor.TYPE_STEP_COUNTER 获取步数前需要手机支持该传感器 1.学习资料 1.1 SENSOR.TYPE_STEP_COUNTER 地址:开发者文档 翻 ...

  8. 【分享】thanos receiver的grafana报表配置

    具体的部署是:用prometheus抓取thanos receiver的10909端口,然后grafana再请求这个prometheus 具体的JSON配置请见最后 本文的一些监控配置,参考了这篇文章 ...

  9. nao机器人使用手册

    简单使用和保养 开关机和马达 开机是按一下,后来按一下相当于重启了一次程序,3是播报IP地址,5秒是关机,8秒是强制关机. 电池 3月左右不用需要取下电池.夏天5-8小时,冬天8-10小时充电.活动时 ...

  10. 虚拟化架构与Centos7系统部署

    1.什么是虚拟化(Virtualization) 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可 ...