爵士好提

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. PHP几个常见不常用的方法

    method_exists判断方法是否存在 <?php class F{ public function __construct(){ if(method_exists($this, 'son_ ...

  2. 1.2 Hadoop快速入门

    1.2 Hadoop快速入门 1.Hadoop简介 Hadoop是一个开源的分布式计算平台. 提供功能:利用服务器集群,根据用户定义的业务逻辑,对海量数据的存储(HDFS)和分析计算(MapReduc ...

  3. Changes in GreatSQL 8.0.25-16(2022-5-16)

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1.新增特性 1.1 新增仲裁节点(投票节点)角色 1.2 新增快速单主模式 1.3 新增MGR网络开销阈值 1.4 ...

  4. 深入理解Aarch64内存管理

    本文是对learn_the_architecture_-_aarch64_memory_management的部分翻译和个人注解.个人英文水平有限,若有翻译不当,欢迎加我私人微信LinuxDriver ...

  5. 新一代大数据任务调度系统 - Apache DolphinScheduler 1.3.4 发布,推荐下载

    | 本文编辑:朱桐 新一代大数据任务调度 - Apache DolphinScheduler(incubator) 在经过社区 30 多位小伙伴的贡献与努力下于发布了 1.3.4 版本,1.3.4 作 ...

  6. 成为 Apache 贡献者,从提交第一个简单 PR 开始!

    开源之路,PR 走起 ! ---全球最大同性交友社区 1 fork 以下实例以 incubator-dolphinscheduler 海豚调度为例进行操作 从远端仓库* https://github. ...

  7. java-重载、包修饰词以及堆栈管理

    1.方法的重写(Override):重新写.覆盖 1)发生在父子类中,方法名称相同,参数列表相同,方法体不同 2)重写方法被调用时,看对象的类型2.重写与重载的区别: 1)重写(Override): ...

  8. 字节跳动基于ClickHouse优化实践之“多表关联查询”

    更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量 ...

  9. CF600E Lomsat gelral (dfs序+莫队)

    题面 题解 看到网上写了很多DSU和线段树合并的题解,笔者第一次做也是用的线段树合并,但在原题赛的时候却怕线段树合并调不出来,于是就用了更好想更好调的莫队. 这里笔者就说说莫队怎么做吧. 我们可以通过 ...

  10. 长篇图解etcd核心应用场景及编码实战

    大家好啊,我是字母哥,今天写一篇关于etcd的文章,其实网上也有很多关于etcd的介绍,我就简明扼要,总结提炼,期望大家通过这一篇文章掌握etcd的核心知识以及编码技能! 本文首先用大白话给大家介绍一 ...