CCPC-Winter Camp div2 day8 A
---恢复内容开始---
题目:

题解:
我们考虑第i个叶子节点的情况,根据题目给的输入条件,我们可以知道,深度大的节点的序号一定是大于深度浅的节点的序号的
如图

题目要求我们找出每一个叶子节点距离编号小于他的叶子节点的最小值
叶子节点很好找,就是树中出度为0的点,那么我们怎么找距离最近呢?
我们知道节点深度随着叶子节点的序号递增时递增,但是相邻的两个叶子节点的距离是否一定是最小的呢?显然不是的
我们需要求出最小距离
以这张图为例

对于点5,我们是找点5和点2的距离 dep[1,5]+dep[1,2]
对于点7,我们是找点7和点2的距离 dep[1,7]+dep[1,2]
对于点10,我们是找点10和点7的距离 dep[6,7]+dep[6,10]
聪明的你有没有看出来,实际上我们只是需要找到,叶子节点的lca点即可!
那么我们最短的距离一定是,从底至上更新信息,当推到根节点或者走过的点的时候,当前节点的信息就是,当前点,到距离他最近的叶子节点的距离
那么第i个叶子节点的答案就是
从当前节点向上dfs,直到找到根节点或者被标记的节点为止,然后回滚,更新每个节点到距离他最近的叶子节点的距离
得到答案就是这个被标记点的到距离这个被标记点最近的叶子节点的距离+当前叶子节点到被标记点的距离
由于我们是从编号最小的叶子节点开始枚举,我们不会计算重复的情况
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e6 + ;
int n, in[maxn], out[maxn], fa[maxn], minn[maxn], vis[maxn], ans[maxn];
int dfs(int u, int cnt, int id) {
if(vis[u]) {
ans[id] = minn[u] + cnt;
return minn[u] + ;
}
vis[u] = ;
minn[u] = min(cnt, dfs(fa[u], cnt + , id)); //更新从下往上的值还有从上往下的值
return minn[u] + ;
}
int main() {
scanf("%d", &n);
vis[] = ;
fa[] = ;
for(int v = ; v <= n; v++) {
int u;
scanf("%d", &u);
out[u]++;
fa[v] = u;
}
vector<int> vec;
for(int i = ; i <= n; i++) {
if(out[i] == ) {
vec.push_back(i);
}
}
minn[] = 1e9;
sort(vec.begin(), vec.end());
for(int i = ; i < vec.size(); i++) {
dfs(vec[i], , i);
}
ans[] = -;
for(int i = ; i < vec.size(); i++) {
printf("%d %d\n", vec[i], ans[i]);
} }
CCPC-Winter Camp div2 day8 A的更多相关文章
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2019 wannafly winter camp
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...
- 2019 wannafly winter camp day 3
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...
- 线段树优化建图(cf787d, 2019Wannafly Winter Camp Day7 Div1 E)
线段树优化建图,用于区间到区间建边时降低空间复杂度 建立两颗线段树,一颗in, 代表进入这个区间,一颗out,代表从这个区间出去 in树从父亲向儿子建边,代表宏观进入整个区间,不向下寻找 out树从儿 ...
- 2020 CCPC-Wannafly Winter Camp Day2
2020 CCPC-Wannafly Winter Camp Day2 A 托米的字符串 虽然每个子串出现的概率是相同的,但是同一长度的子串个数是不同的,所以要分别处理.计算出某一长度的情况下,元音字 ...
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite)
咕咕咕. camp补题. 传送门:https://www.zhixincode.com/contest/29/problems A.Aqours 题意:有一棵有根树,根节点为1,给出每个结点的父 ...
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) A 题 Aqours (精巧的树形DP)
题目链接: https://www.cometoj.com/contest/29/problem/A?problem_id=414 Aqours 题目描述 Aqours 正在 LoveLive! 决赛 ...
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
A Aqours 题解: https://www.cnblogs.com/qieqiemin/p/11251645.html D:吉良吉影的奇妙计划 (暴力打表) 题目描述 吉良吉影是一个平凡的上班族 ...
随机推荐
- 《Effective C++》读书笔记 资源管理
C++程序中最常用的资源包括动态分配的内存,文件描述器,互斥锁,数据库连接,网络socket等等.不论哪种资源,重要的是,当你不再使用他时,必须将他归还给系统. 一个很好的做法是以对象管理资源.把资源 ...
- 理解 JavaScript 原型 / 原型链
关于对象 以下代码中 p 的值是一个新对象,里面拥有 name 和 age 属性 function People(name, age){ this.name = name this.age = age ...
- kvm虚拟化操作
本节演示如何使用 virt-manager 启动 KVM 虚机. 首先通过命令 virt-manager 启动图形界面 # virt-manager 点上面的图标创建虚机 给虚机命名为 kvm1,这里 ...
- IMX6移植htop
top命令查看CPU利用率并不是很方便,因此打算移植htop到imx6上,主要包括以下几个步骤: - 资源下载 htop 下载http://hisham.hm/htop/releases/1.0.1/ ...
- MyBatis中文文档
http://mybatis.github.io/mybatis-3/zh/index.html
- Thunder团队第一周 - Scrum会议5
本节内容: 工作照片 会议时间 会议地点 会议内容 Todo list 燃尽图 Scrum会议5 小组名称:Thunder 项目名称:爱阅app Scrum Master:邹双黛 工作照片: 参会成员 ...
- 算法与数据结构实验题 6.4 Summary
★实验任务 可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记 下了他认为的各个地点的小偷数量. 现在我们将 Bibi 的家附近的地形抽象成一棵有根树.每个地点都是树上的 一个节 ...
- ACM 第二天
A - Mishka and Contest Mishka started participating in a programming contest. There are n problems i ...
- 分布式系统理论-terms
Distributed programming is the art of solving the same problem that you can solve on a single comput ...
- 用SC命令 添加或删除windows服务提示OpenSCManager 失败5 拒绝访问
在安装命令行中安装 windowsOpenSCManager 失败5 的错误,原因是当前用户的权限不足,需要做的是在注册表 HKEY_LOCAL_MACHINE\Software\Microsof ...