2120 -- 预警系统题解

news/2024/7/20 21:30:03 标签: 算法, c++, 深度优先

Description

OiersOiers 国的预警系统是一棵树,树中有 �n 个结点,编号 1∼�1∼n,树中每条边的长度均为 11。预警系统中只有一个预警信号发射站,就是树的根结点 11 号结点,其它 �−1n−1 个结点是接收中转站。
每当有险情发生时,11 号结点就会向 �x 号结点发送预警信号,然后由 �x 号结点将预警信号传送到离 11 号结点距离为 �y 的所有结点,注意:所有传送是单向的,都是由根结点向叶子结点方向传送,请参考样例。
你的任务是计算每次发送预警时,�x 号结点需要将预警信号传送到离 11 号结点距离为 �y 的结点个数。

Input

第一行一个整数 �n。
第二行 �−1n−1 个整数 ��2,��3,⋯,���fa2​,fa3​,⋯,fan​ 描述树,整数 ���fai​ 表示结点 �i 的父亲结点为 ���(2≤�≤�)fai​(2≤i≤n)。
第三行一个整数 �m,表示有 �m 次险情发生,需要发送 �m 次预警信号,即有 �m 次询问。
接下来 �m 行,每行两个整数 �,�x,y。

Output

输出 m 行,每行一个整数,表示�x 号结点需要将预警信号传送到离 11 号结点距离为 �y 的结点个数。

Sample Input

7
1 2 2 2 1 3
4
1 2
5 2
4 1
3 5

Sample Output

3
1
0
0

Sample Explanation

在第一个询问中,由 11 号结点传送到距 11 号结点距离为 22 的结点有 3,4,53,4,5 三个结点。
在第二个询问中,由 55 号结点传送到距 11 号结点距离为 22 的结点只有 55 号自身一个结点。
在第三个询问中,由 44 号结点传送到距 11 号结点距离为 11 的结点不存在,因为传送只能往下进行。
在第四个询问中,由 33 号结点传送到距 11 号结点距离为 55 的结点不存在。

Hint

本题共 2525 个测试点,其中:
20%20% 的数据:1≤�≤1001≤n≤100,1≤�≤101≤m≤10;
另有 12%12% 的数据:1≤�≤1001≤n≤100,1≤�≤101≤m≤10,树为一条链;
100%100% 的数据:2≤�≤2×1052≤n≤2×105,1≤���<�1≤fai​<i,1≤�≤2×1051≤m≤2×105,1≤�≤�1≤x≤n,0≤�≤�−10≤y≤n−1。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,u,y,id,time_id,d[200009],tim_in[200009],tim_out[200009],head[200009];
vector<int> v[200009];
struct edge{
	int u,v,next;
}e[400009];
void add(int u,int v){
	e[++id]=edge{u,v,head[u]};
	head[u]=id;
}
void dfs(int u,int fa){
	d[u]=d[fa]+1;
	tim_in[u]=++time_id;
	v[d[u]].push_back(tim_in[u]);
	for(int i=head[u];i;i=e[i].next) dfs(e[i].v,u);
	tim_out[u]=time_id;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=2;i<=n;i++){
		cin>>u;
		add(u,i);
	}
	d[0]=-1;
	dfs(1,0);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>u>>y;
		cout<<upper_bound(v[y].begin(),v[y].end(),tim_out[u]) - lower_bound(v[y].begin(),v[y].end(),tim_in[u])<<'\n';
	}
	return 0;
}

总结:

这题得用一种叫DFS序的东西,二分求最值


http://www.niftyadmin.cn/n/5065565.html

相关文章

YAMLException : java.nio.charset.MalformedInputException : Input length = 1

场景还原 有小伙伴反应SpringBoot项目启动异常&#xff0c;但是同组其他伙伴的无问题&#xff01; ERROR org.springframework.boot.SpringApplication - Application run failedorg.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException : Inpu…

<C++>类和对象-下

目录 一、构造函数的初始化 1. 构造函数体赋值 2. 初始化列表 2.1 概念 2.2 隐式类型转换式构造 2.3 explicit关键字 二、static静态成员 1. 概念 2. 特性 三、友元 1. 友元函数 2.友元类 四、内部类 1. 概念 五、匿名对象 1. const引用匿名对象 2. 匿名对象的隐式类型转换 总…

106.从中序与后序遍历序列构造二叉树

力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&#xff1a; class Solution { public:Tr…

Python前景如何?有哪些就业方向?

人工智能时代来临&#xff0c;Python人才缺口日益扩大&#xff0c;加上随着工作年限增加薪资也会增高&#xff0c;是最流行的前五名语言之一。 那么学习Python的就业方向有哪些呢&#xff1f;给大家总结了七大方向可以参考。 Web开发&#xff08;Python后端&#xff09; Pyth…

计算机竞赛 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…

【算法训练-字符串 三】字符串相加

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串相加】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

网站白屏优化

网站白屏优化 <div v-foritem in 10000><child></child> </div>比如要渲染当前页面&#xff0c;会很慢&#xff0c;页面上出现长时间的白屏&#xff0c;因为要渲染10000次child组件。 我们提供的解决方案是按帧加载Dom。 使用按帧加载就不得不提到req…

Android 进阶——系统启动之BootLoader 及内核启动一(下)

文章大纲 引言一、Android 系统启动流程概述1、手机电源被打开时&#xff0c;首先是引导进入BootLoader分区2、BootLoader分区加载Linux 内核3、内核解析执行init.rc脚本并启动进程id为1 的init进程4、init进程初始化各种Android系统服务、ServiceManager以及Zygote 进程孵化器…