灾难 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos关于”running yum-complete-transaction first...

2019独角兽企业重金招聘Python工程师标准>>> 今天在用yum安装软件出错几次户&#xff0c;总是有提示信息&#xff1a; There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them. The program yum…

js身份证号、电话脱敏处理(用*替换中间数据)

数字类型 certificatecodecopy certificatecode.replace(/^(.{6})(?:\d)(.{4})$/, "\$1****\$2"); 所有类型 enginenocopy engineno.replace(/^(.{2})(?:\w)(.{1})$/, "\$1****\$2"); enginenocopy engineno.replace(/^(.{4})(?:\w)(.{4})$/, &…

Linux 系统应用编程——网络编程(I/O模型)

Unix下可用的5种I/O模型&#xff1a;阻塞I/O非阻塞I/OI/O复用(select和poll)信号驱动I/O(SIGIO)异步I/O(POSIX的aio_系列函数)一个输入操作通常包括两个不同的阶段&#xff1a;1&#xff09;等待数据准备好&#xff1b;2&#xff09;从内核向进程复制数据&#xff1b;对于一个套…

Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)

图中括号中的数字代表的是当前域所占的空间大小&#xff0c;单位是bit位。 黄色的是数据链路层的头部&#xff0c;一共14字节 绿色的部分是IP头部&#xff0c;一般是20字节 紫色部分是TCP头部&#xff0c;一般是20字节 最内部的是数据包内容 黄色部分&#xff1a;链路层 目的MA…

Linux 系统应用编程——网络编程(TCP 协议三次握手过程)

TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议&#xff0c;提供可靠的连接服务&#xff0c;采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示: SYN ( synchronous 建立联机 ) ACK ( acknowledgement 确认 ) PSH ( push 传送…

基于ELK的简单数据分析

原文链接&#xff1a; http://www.open-open.com/lib/view/open1455673846058.html 环境 CentOS 6.5 64位JDK 1.8.0_20Elasticsearch 1.7.3LogStash 1.5.6Kibana 4.1.4介绍 ElasticSearch是有名的开源搜索引擎&#xff0c;现在很多公司使用ELK技术栈做日志分析&#xff0c;比如…

[win10] 在桌面上显示计算机、控制面板、网络

1. 右击桌面&#xff0c;选择个性化 2. 选择”主题", 点击“桌面图标设置” 3. 把想要放桌面的图标给钩上

linux下共享文件夹(windows可访问,linux也可访问)

2019独角兽企业重金招聘Python工程师标准>>> 本文是转字网上的两段&#xff0c;如果是菜鸟&#xff0c;想懂有点难度&#xff0c;我这里给点注释 在linux上共享文件夹windows下看 ******************************************* 首先给linux设一个ip&#xff0c;要和…

Linux---进程调度相关命令解析

进程相关命令 1、ps 查看系统中的进程 使用方式&#xff1a;ps [options] [--help] 说明&#xff1a;显示瞬间进程 (process) 的动态 参数&#xff1a;ps的参数非常多, 在此仅列出几个常用的参数并大略介绍含义 ps命令常用用法&#xff08;方便查看系统进程&#xff09; 1&a…

Linux 系统应用编程——多线程经典问题(生产者-消费者)

“生产者——消费者”问题是Linux多线程编程中的经典问题&#xff0c;主要是利用信号量处理线程间的同步和互斥问题。 “生产者——消费者”问题描述如下&#xff1a; 有一个有限缓冲区&#xff08;这里用有名管道实现 FIFO 式缓冲区&#xff09;和两个线程&#xff1a;生产者和…

Linux 系统应用编程——进程间通信(下)

在前面&#xff0c;我们学习了传统的进程间通信方式——无名管道&#xff08;pipe&#xff09;、有名管道&#xff08;fifo&#xff09;和信号&#xff08;signal&#xff09;。 下面我们来学习 System V IPC 对象&#xff1a; 1、共享内存&#xff08;share memory&#xff0…

.balignl 16,0xdeadbeef浅析

http://zqwt.012.blog.163.com/blog/static/12044684201031102956976/ 最近在分析u-boot的源代码&#xff0c;看到这一行&#xff1a; .balignl 16, 0xdeadbeef不知道为什么要这样写&#xff0c;0xdeadbeef&#xff0c;明显是个单词组&#xff0c;写在这里有何意义呢&am…

使用maven导入任意jar包

http://mvnrepository.com/ 我这里&#xff0c;因为是spark1.5.2版本。 保存&#xff0c;maven会自动下载jar包到本地仓库。 转载于:https://www.cnblogs.com/lchzls/p/6281764.html

Linux下静态IP地址的设置及TFTP服务的搭建

TFTP&#xff08;Trivial File Transfer Protocol,简单文件传输协议&#xff09;是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。TFTP承载在UDP上&#xff0c;提供不可靠的数据流传输服务&#xff0c;…

bzoj 3924 幻想乡战略游戏

题目大意&#xff1a; 有边权点权的树&#xff0c;动态修改点权 每次修改后求带权重心x (\(minimize\) \(S\sum_i val[i]*dist[x][i]\)) 分析&#xff1a; 从暴力找突破口&#xff1a; 对于边x,y&#xff0c;设长度为len&#xff0c;切断后x半边树权值和为\(w_1\)&#xff0c;y…

Linux 系统应用编程——网络编程(基础篇)

一、网络体系结构 1、OSI模型和TCP/IP 模型 网络体系结构指的是网络的分层结构以及每层使用的协议的集合。其中最著名的就是OSI协议参考模型&#xff0c;他是基于国际标准化组织&#xff08;OSI&#xff09;的建议发展起来的。它分为7个层次&#xff1a;应用层、表示层、会话层…

C++中函数的默认参数

使用方法&#xff1a; &#xff08;1&#xff09;在函数声明或定义时&#xff0c;直接对参数赋值&#xff0c;该参数就是默认参数。&#xff08;2&#xff09;在函数调用时&#xff0c;省略部分或全部参数&#xff0c;这时就会使用默认参数进行代替。注意事项&#xff1a; &…

Linux 系统应用编程——网络编程(socket编程)

二、网络编程基础 1、套接字概述 套接字就是网络编程的ID。网络通信&#xff0c;归根到底还是进程间的通信&#xff08;不同计算机上的进程间的通信&#xff09;。在网络中&#xff0c;每一个节点&#xff08;计算机或路由器&#xff09;都有一个网络地址&#xff0c;也就是IP地…

php curl拉取远程图片

<?php $url "图片绝对地址/thumbnail.jpg"; $filename curl.jpg; getImg($url, $filename); /**通过curl方式获取制定的图片到本地* 完整的图片地址* 要存储的文件名*/ function getImg($url "", $filename "") {if(is_dir(basename($fi…

利用indent格式化源文件的脚本

脚本一&#xff1a;格式化指定目录下的源文件(*.h, *.cpp...) #!/bin/sh# 格式化某目录下所有*.h, *.c, *.cpp, *.hh文件, 并将文件换行符转换成Linux下的格式if [ $# -lt 1 ]; thenecho "Usage: $0 <dir>"exit 1elsedir$1fi# format a source file(*.c, *.h,…