Comet OJ CCPC-Wannafly Winter Camp Day8 A Aqours
A Aqours
分析:
给出的点可以视为是按照BFS序给的,也就是说从浅到深给出。可以再给每个节点u维护一个f值,表示离u最近的叶子节点到它的距离。
所以每当扫到一个叶子节点,就可以暴力往根节点跳,边跳边更新f值,直到跳到一个已被其他叶子节 点跳到过的节点为止。 那么对于当前的叶子节点,离它最近的编号小于它的叶子节点到它的距离就是跳到这个终止节点的f值 +跳的步数。
在求完之后,还要从上述的终止节点沿着原路更新一下f值,因为可能当前叶子比较深但之前有比较浅 的叶子节点。
因为点是按从浅到深的顺序给出,所以一个节点的f值只会被最先跳到它的叶子节点赋值一次,也只会 被更新一次,所以复杂度是 O(n) 的。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define pa pair<int,int>
#define Fi first
#define Se second
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int g[N], isleaf[N], d[N], fa[N], ans[N]; int main() {
int n = read();
if (n == ) { printf("1 -1"); return ; }
for (int i = ; i <= n; ++i) isleaf[i] = ;
for (int i = ; i <= n; ++i) {
fa[i] = read();
isleaf[fa[i]] = ;
d[i] = d[fa[i]] + ;
}
for (int i = ; i <= n; ++i) g[i] = 1e9;
bool fir = ;
for (int i = ; i <= n; ++i) {
if (!isleaf[i]) continue ;
int x = i, y;
g[x] = ;
while (fa[x]) {
if (g[fa[x]] == 1e9) {
g[fa[x]] = g[x] + ;
x = fa[x];
ans[i] ++;
}
else {
ans[i] += g[fa[x]] + ;
break;
}
}
if (!fir) { printf("%d -1\n", i), fir = ; continue; }
else printf("%d %d\n", i, ans[i]); y = fa[x], x = i;
while (x != y) {
g[x] = min(g[x], g[y] + d[x] - d[y]);
x = fa[x];
}
}
return ;
}
Comet OJ CCPC-Wannafly Winter Camp Day8 A Aqours的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
- 2020 CCPC Wannafly Winter Camp Day1-F-乘法
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...
- 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.这是第一次转化. 涉 ...
随机推荐
- Ajax 请求下载 Execl 文件
通过Ajax请求下载Execl 的问题,掉进一个坑里半个多小时,特此来记录一下 . 起初 我误以为是后台的问题,然而调试了一下并不是这样的,也不会报错,且进入了success 函数. 以下的事件及请 ...
- 设计多选一按钮ChooseOnlyButton
设计多选一按钮ChooseOnlyButton 效果: 源码: ChooseOnlyButton.h 与 ChooseOnlyButton.m // // ChooseOnlyButton.h // ...
- my sql 下左连接 右链接、内连接等应用,INNER JOIN LEFT JOIN RIGHT JOIN
1.数据准备 建两个表格: create table student (idstu int, namestu ) ); ,"张三")(,"李四"),(,&quo ...
- 深入浅出TFS——创建WorkItem
使用场景:在项目交付流程当中,我们在准备部署项目的时候,比如需要依次部署到DEV.QA和PROD共3个不同的环境.我们需要由专门负责部署的部门Integration Team的人员来操作.这个时候我们 ...
- 解决标题过长的CSS
不知道为什么大家用截取字符串的人很多呢.. <html> <head> <style type="text/css"> .divout { di ...
- [EffectiveC++]item26:尽可能延后变量定义式的出现时间
- 64位操作系统下调用32位com的问题
Hello Guys! I am trying to create a simple VBS script to automatically open some .tif images from a ...
- 基于easyui开发Web版Activiti流程定制器详解(三)——页面结构(上)
上一篇介绍了定制器相关的文件,这篇我们来看看整个定制器的界面部分,了解了页面结构有助于更好的理解定制器的实现,那么现在开始吧! 首先,我们来看看整体的结构: 整体结构比较简单,主要包括三个部分: 1. ...
- python第十四课--排序及自定义函数之自定义函数(案例二)
案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...
- python第七课——循环结构 while
while循环: 2.1.有四要素组成: ①.初始化条件(执行一次)一个起始数据/起点,一般使用变量来进行存储 ②.循环条件(可能执行多次)循环合适结束全靠它,执行结果为True,那么循环继续,反之, ...