灾难 BZOJ 2815
灾难
【样例输入】
5
0
1 0
1 0
2 3 0
2 0
【样例输出】
4
1
0
0
0
题解:
先跑出拓扑序
我们按拓扑序建立一棵“灭绝树”
灭绝树含义是当一个点灭绝时,它的子树将会全部灭绝
所以答案就是点在灭绝树中的子树大小
一个点如果灭绝,那么需要所有指向它的点灭绝
由于拓扑序的关系,指向它的点已经加入过了"灭绝树”中
所以这个点要灭绝,就需要所有指向它的点全部灭绝,即这些点的最近公共祖先
那么直接我们将这个祖先与此点连边,更新Lca
最后求出子树大小,即统计答案
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 inline int Get() 9 { 10 int x = 0; 11 char c = getchar(); 12 while('0' > c || c > '9') c = getchar(); 13 while('0' <= c && c <= '9') 14 { 15 x = (x << 3) + (x << 1) + c - '0'; 16 c = getchar(); 17 } 18 return x; 19 } 20 const int me = 1000233; 21 int n; 22 int head, tail; 23 int in[me]; 24 int ue[me]; 25 int de[me]; 26 int si[me]; 27 int fat[me][21]; 28 int tot, nex[2][me], fir[2][me], to[2][me]; 29 inline void Ins(int x, int y, int z) 30 { 31 nex[z][++tot] = fir[z][x]; 32 fir[z][x] = tot; 33 to[z][tot] = y; 34 } 35 inline void Topo() 36 { 37 head = 0, tail = 0; 38 for(int i = 1; i <= n; ++i) 39 if(!in[i]) 40 ue[++tail] = i; 41 while(head < tail) 42 { 43 int u = ue[++head]; 44 for(int i = fir[0][u]; i; i = nex[0][i]) 45 { 46 int v = to[0][i]; 47 --in[v]; 48 if(!in[v]) ue[++tail] = v; 49 } 50 } 51 } 52 inline int Lca(int x, int y) 53 { 54 if(x < 0) return y; 55 if(de[x] < de[y]) swap(x, y); 56 for(int i = 20; i >= 0; --i) 57 if(de[fat[x][i]] >= de[y]) 58 x = fat[x][i]; 59 for(int i = 20; i >= 0; --i) 60 if(fat[x][i] != fat[y][i]) 61 { 62 x = fat[x][i]; 63 y = fat[y][i]; 64 } 65 if(x == y) return x; 66 return fat[x][0]; 67 } 68 inline void Update(int u, int v) 69 { 70 fat[v][0] = u; 71 de[v] = de[u] + 1; 72 for(int i = 1; i <= 20; ++i) 73 fat[v][i] = fat[fat[v][i - 1]][i - 1]; 74 } 75 inline void Build() 76 { 77 while(tail) 78 { 79 int u = ue[tail]; 80 int lca = -1; 81 for(int i = fir[0][u]; i; i = nex[0][i]) 82 { 83 int v = to[0][i]; 84 lca = Lca(lca, v); 85 } 86 if(lca < 0) lca = 0; 87 Ins(lca, u, 1); 88 Update(lca, u); 89 --tail; 90 } 91 } 92 void Ergo(int u) 93 { 94 si[u] = 1; 95 for(int i = fir[1][u]; i; i = nex[1][i]) 96 { 97 int v = to[1][i]; 98 Ergo(v); 99 si[u] += si[v]; 100 } 101 } 102 int main() 103 { 104 n = Get(); 105 for(int i = 1; i <= n; ++i) 106 { 107 int x = Get(); 108 while(x) 109 { 110 ++in[x]; 111 Ins(i, x, 0); 112 x = Get(); 113 } 114 } 115 Topo(); 116 Build(); 117 Ergo(0); 118 for(int i = 1; i <= n; ++i) 119 printf("%d\n", si[i] - 1); 120 }
转载于:https://www.cnblogs.com/lytccc/p/6253270.html
灾难 BZOJ 2815相关推荐
- [Luogu P2597] [BZOJ 2815] [ZJOI2012]灾难
洛谷传送门 BZOJ传送门 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生 ...
- Lengauer-Tarjan算法--支配树构造(bzoj 2815: [ZJOI2012]灾难)
模型: 一个有向图G,设定一个点r,要求点r能到达G中所有的点,如果这样的点不存在,新建并向所有入度为0的点连边 支配点: 对于点u,如果在删掉点p之后,r不能到达u,那么称p(p!=u)点是u点的一 ...
- 存档……【假装自己会刷题【怎么写着写着成了日记啊
2017.4.9 AFO 2017.2.27 嗨呀--昨天补了半天觉--十二点十分起床,稳,只有十二个小时的周末.rmvb 然后--下午来学校开黑,由于车速太快,一万个人翻车被skipped[捂脸]- ...
- [Luogu P4338] [BZOJ 5212] [ZJOI 2018] 历史
洛谷传送门 BZOJ传送门 题目背景 九条可怜是一个热爱阅读的女孩子. 题目描述 这个世界有 nnn 个城市,这 n" role="presentation" style ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- 分类问题中的“维数灾难” - robotMax
分类问题中的"维数灾难" - robotMax 在看机器学习的论文时,经常会看到有作者提到"curse of dimensionality",中文译为" ...
- SQL Server中灾难时备份结尾日志(Tail of log)的两种方法
简介 在数据库数据文件因各种原因发生损坏时,如果日志文件没有损坏.可以通过备份结尾日志(Tail of log)使得数据库可以恢复到灾难发生时的状态. 例如: 上图中.在DB_1中做了完整备份,在Lo ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...
最新文章
- redis服务端基本命令
- java之 Timer 类的使用以及深入理解
- Java的JDBC事务详解
- 为什么要“男孩穷养、女孩富养”
- 记一次 .NET 医院CIS系统 内存溢出分析
- 三个线程打印ABC10次,ABCABCABC....
- 十步教你成为数据科学家!
- 哈佛有只”精灵球“,唯有它能温柔收放深海的软体精灵 |Science Robotics
- 为AI芯片铺路?原三星半导体周军加盟Rokid
- 信息系统服务器维护,信息系统运行维护服务方案(IT运维服务方案)-20210729025444.pdf-原创力文档...
- 百度云文字识别 (AIPOcr)
- Word公式自动编号
- 基于SpringBoot+JSoup+POI+Swagger2实现校园教务系统成绩课程等信息抓取,并提供接口访问的小项目
- 漫画:鉴权与安全访问控制的技术血脉
- 麦马计算机科学和麦马数学专业,积极配合 成功申请麦克马斯特大学数学专业...
- ArcGIS利用Model批量裁剪
- netcat工具安装
- 上海出租车颜色 失物招领电话
- drawio 绘制手绘素描线稿样式
- 数字孪生城市可视化大屏设计,智慧楼宇开源项目
热门文章
- python(1) - 数据类型和变量
- Visual Studio 快捷键汇总
- 车牌识别中的可识性、放弃率、精度与识别率辨析
- Linux 下杀毒软件 clamav 的安装和使用
- Python 主成分分析PCA
- Linux下安全审计工具 lynis 使用说明
- Web优化 --利用css sprites降低图片请求
- 在Brackets中使用jsHint遇到的问题
- sqlserver2005仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'SendMealAddress'中为标识列指定显式值。...
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第六集