爵士好提

Solution

定义\(u\)控制\(v\)当且仅当\(u\)死后\(v\)也会死

把图建出来,从食物向消费者连边

我们不难想到只能先处理食物,再处理消费者,所以先上个拓扑排序

想一想暴力怎么做,对于每个点我们考虑状压维护这个点受哪些点控制,暴力合并即可。

但显然,这个暴力的复杂度是\(O(n^2)\)的。

考虑到控制的一个性质:若\(x\)控制\(z\)而\(y\)同样控制\(z\),则要么\(x\)控制\(y\),要么\(y\)控制\(x\)

我们不妨考虑根据控制的关系建出一棵树来,\(u\)是\(v\)的祖先当且仅当\(u\)控制\(v\),显然,一个点的答案就是这个点在树上对应点节点为根的子树大小\(-1\)

怎么建出这棵树?

接下来的问题就很显然了,我们考虑每遍历到一条边\((u,v)\)都用\(u\)去更新\(v\)的父亲,具体过程用\(\text{LCA}\)算法即可,我使用倍增实现,需要在线维护倍增数组

Code

#include <cstdio>
#include <iostream>
using namespace std;
inline int read() {
int res = 0, flag = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') flag = 1;
for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
if(flag) res = ~res + 1; return res;
}
const int N = 70000;
int n, tail, head, que[N];
int la[N], la1[N], tot, tot1, d[N], fa[N][20], dep[N], sz[N];
struct Edge {int to, nxt;} e[2000010], e1[100000];
inline void build(int u, int v) {e[++tot] = (Edge) {v, la[u]}, la[u] = tot, ++d[v];}
inline void build1(int u, int v) {e1[++tot1] = (Edge) {v, la1[u]}, la1[u] = tot1;}
void update(int x) {
if(x == n + 1) return ;
build1(fa[x][0], x), dep[x] = dep[fa[x][0]] + 1;
for(int i = 1; i <= 17; ++i)
fa[x][i] = fa[fa[x][i - 1]][i - 1];
return ;
}
inline int getlca(int x, int y) {
if(dep[x] < dep[y]) swap(x, y);
for(int i = 17; i + 1; --i)
if(dep[fa[x][i]] >= dep[y]) x = fa[x][i];
if(x == y) return x;
for(int i = 17; i + 1; --i)
if(fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
void work(int x, int y) {fa[x][0] = (fa[x][0] ? getlca(fa[x][0], y) : y);}
void dfs(int k) {
sz[k] = 1;
for(int v, i = la1[k]; i; i = e1[i].nxt) {
v = e1[i].to;
dfs(v), sz[k] += sz[v];
}
return ;
}
void solve() {
que[tail = 1] = n + 1, dep[n + 1] = 1;
while(++head <= tail) {
update(que[head]);
for(int v, i = la[que[head]]; i; i = e[i].nxt) {
v = e[i].to;
--d[v], work(v, que[head]);
if(!d[v]) que[++tail] = v;
}
}
dfs(n + 1);
}
int main() {
n = read();
for(int v, u = 1; u <= n; ++u) {
v = read();
while(v) build(v, u), v = read();
}
for(int i = 1; i <= n; ++i) if(!d[i]) build(n + 1, i);
solve();
for(int i = 1; i <= n; ++i) printf("%d\n",sz[i] - 1);
}

[ZJOI2012] 灾难 题解的更多相关文章

  1. 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA

    [BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...

  2. [洛谷P2597] [ZJOI2012]灾难

    洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...

  3. Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造

    Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...

  4. 1321. [ZJOI2012] 灾难

    1321. [ZJOI2012] 灾难 ★★☆   输入文件:catas.in   输出文件:catas.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 阿米巴是小强的 ...

  5. 洛谷 P2597 [ZJOI2012]灾难 解题报告

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

  6. P2597 [ZJOI2012]灾难——拓扑,倍增,LCA

    最近想学支配树,但是基础还是要打好了的: P2597 [ZJOI2012]灾难 这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝: 求得就是一个点能支配几个点: 如果一个 ...

  7. 【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)

    懒得复制,戳我戳我 Solution: 这题思路很神奇,首先你要知道这个毁灭树是怎么保证实现的:一句话就是如果该节点要被破坏,他的所有父节点就要被破坏,也就只要所有父节点的LCA被破坏就可以,所以我们 ...

  8. 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA

    题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ...

  9. P2597 [ZJOI2012]灾难

    \(\color{#0066ff}{ 题目描述 }\) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝, ...

随机推荐

  1. 抖音 滑块验证方案 s_v_web_id 参数分析

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 抖音web端 s_v_web_id 参数 ...

  2. ESP32与MicroPython入门-01 搭建开发环境

    ESP32简介 ESP32 是上海乐鑫公司开发的一款比较新的32位微控制器,它集成了WiFi及蓝牙等功能,有着性能稳定.功耗低.价格低廉等特点,非常适用于物联网开发,但也可以作为普通的MCU使用. E ...

  3. 关于Copy On Write Array List,你会安全使用么

    摘要:JDK中提供了CopyOnWriteArrayList类,简称COW.为了将读取的性能发挥到极致,CopyOnWriteArrayList读取是完全不用加锁的,并且更厉害的是:写入也不会阻塞读取 ...

  4. 【JAVA】学习路径64-补充-编写一个会抛异常的方法

    有一些方法,在调用的时候有可能会出错,所以我们使用这些方法的时候会使用try catch. 比如InputStream里面的read()方法等等,那么这些方法是怎么实现抛异常的效果的呢? 能抛异常的方 ...

  5. 牛客练习赛99—C

    数的和与积 https://ac.nowcoder.com/acm/contest/34330/C 思路: 2和4是不可以的,除了3意外其他的都可以用三项解决,其中一项为1,剩余两项分别设为x,y.  ...

  6. 【PMP学习笔记】第5章 项目范围管理

    一.规范管理的内涵 项目范围管理:包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程. 项目范围:为交付具有规定特性与功能的产品.服务或成果而必须完成的工作. 预测型:开始时定义可交付成果, ...

  7. Springboot shiro JWT集成总结

    SpringBoot Shiro JWT 1.建表 DDL.sql CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, ` ...

  8. dp-LIS LCS 模型

    最长上升子序列问题: https://www.cnblogs.com/sxq-study/p/12303589.html 一:两遍LIS问题 1:题目: 怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为 ...

  9. Windows Server体验之升级安装

    由于Windows Server的版本是每半年更新的,而微软对于产品的支持周期又是有限的.比如Windows Server 1803的主流支持只到2019年11月12日.也就是说,最多1年半,就需要更 ...

  10. KMP&Z函数详解

    KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...