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:吉良吉影的奇妙计划 (暴力打表) 题目描述 吉良吉影是一个平凡的上班族 ...
随机推荐
- 259 [LeetCode] 3Sum Smaller 三数之和较小值
题目: Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 ...
- Python3 异常与断言
1.异常 当出现错误时,程序就会发生异常 num1=input('Please input a num1: ') num2=input('Please input a num2: ') print(f ...
- vue移动音乐app开发学习(三):轮播图组件的开发
本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...
- Uncaught Error: Syntax error, unrecognized expression: |117的js错误
117指的是js代码在浏览器运行时的出错的行号 var a="117|117" 前面的错误是由于有特殊符号“|”,用$("txtId"+a).val();去取 ...
- iOS- UIPickerView餐厅点餐系统
在餐厅里的点餐系统的核心控件就是UIPickerView 今天晚上在整理以前的项目笔记时,特意把UIPickerView单独拿出来,做了一个简陋的点餐道具. 因为没有素材图片,所有大家将就看看吧 0. ...
- css那些事儿2 盒子模型
盒子模型是网页元素所占据页面窗口的矩形范围,是网页布局的核心基础之一,这里的盒子模型与我们平常收到的包裹类似. 一个包裹从内到外,分为真实物品部分,物品与外壳之间的填充区,外壳的厚度,当多个包裹放置在 ...
- CentOS/Linux 开放80、8080端口或者开放某个端口
装载系统的时候只开启了22端口.结果再装完Nginx+php+mysql 后不能访问网站. iptables -L -n 查看防火墙设置发现没开启80端口 由于Linux防火墙默认是关闭的.可以用两种 ...
- FastReport.net 常用方法
一.页面设置 情景:FastReport设计器页面默认设置为A4纸,但如果需要显示的字段过多,这时就出现了页面的大小无法满足完整显示所需内容的问题. 解决:出现这个问题后,我们可以在来到"文 ...
- str.substring(beginIndex,endIndex)-008
// 将字符串str前n位放在后面,返回新的字符串 public String headToTail(String str,int n){ if(n==0){ System.out.println(s ...
- 关于c++中public & private方法调用问题
class IDNoIdentifier { public: IDNoIdentifier(); ~IDNoIdentifier(); typedef vector<cv::Rect> C ...