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:吉良吉影的奇妙计划 (暴力打表) 题目描述 吉良吉影是一个平凡的上班族 ...
随机推荐
- Java注解的基本原理
注解的本质就是一个继承了Annotation接口的接口,一个注解准确意义上来说,只不过是一种特殊注释而已,如果没有解析他的代码,他可能连注释都不如. 解析一个类或者方法的注解往往有两种形式,一种是编译 ...
- TW实习日记:第19天
今天一早上改完信息门户的代码之后,发现接口又出了问题,查了半天都不知道,原来又是网端的问题...真是心累啊,调整了一些细节样式,以及终于把企业微信的消息推送功能做完了.关键就在于有个表存放微信id的字 ...
- 聊一聊 Flex 中的 flex-grow、flex-shrink、flex-basis
在使用 flex 布局的时候难以理解的是 flex-grow.flex-shrink.flex-basis 几个属性的用法,下面通过几个例子来演示. flex-basis flex-basis 用于设 ...
- 【Linux 运维】Centos7初始化网络配置
设置网络 (1)动态获取一个IP地址 #dhclient 系统自动自动获取一个IP地址#ip addr 查看获取的ip地址(2)查看网关,子网掩码 虚拟机编辑>虚拟 ...
- New Year and Domino:二维前缀和
题目描述: They say "years are like dominoes, tumbling one after the other". But would a year f ...
- openstack架构
终于正式进入 OpenStack 部分了. 今天开始,CloudMan 将带着大家一步一步揭开 OpenStack 的神秘面纱. OpenStack 已经走过了 6 个年头. 每半年会发布一个版本,版 ...
- vue学习笔记(三):vue-cli脚手架搭建
一:安装vue-cli脚手架: 1:为了确保你的node版本在4.*以上,输入 node -v 查看本机node版本,低于4请更新. 2:输入: npm install -g vue-cli ...
- StrBlob类——智能指针作为成员
/* 管理string的类 使用vector来管理元素 由于类对象被销毁时相应的元素成员也将销毁 所以需要将vector保存在动态内存中 */ //该程序鲁棒性不强,没有考虑到vector为空的情况 ...
- Oil Deposits(DFS连通图)
Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...
- 2019寒假训练营寒假作业(二) MOOC的网络空间安全概论笔记部分
视频课程--MOOC的网络空间安全概论笔记 第一章 网络空间安全概述 2001年,网络空间概念被首次提出: 网络空间安全框架: 1.设备层安全: 可通过截获电磁辐射获取计算机信息.通过硬件木马(恶意电 ...