
Codeforces Round #612 (Div. 1) B Numbers on Tree(dfs+思维)
发布日期:2021-05-08 15:13:55
浏览次数:17
分类:精选文章
本文共 1452 字,大约阅读时间需要 4 分钟。
构造符合条件的权值序列方法解析
定义Ci为i点子树中权值比i小的结点个数,给定每个节点的Ci值,我们需要构造出符合条件的权值序列。本文将详细介绍相关方法和实现思路。
方法概述
构造权值序列的关键在于确定每个节点的权值与其子树排名之间的关系。通过对节点进行深度优先搜索(DFS),我们可以构建每个节点的子树排名序列。将这些排名依据Ci值进行插入,最终得到符合条件的权值序列。
核心实现思路
排名序列构造
对于每个节点x,首先构造其子树的排名序列。将所有子树中的节点按预定规则进行排序,形成一个排名序列。这个过程可以通过递归DFS实现。节点插入位置确定
根据Ci值,确定每个节点在其子树排名序列中的插入位置。例如,假设节点4的Ci值为2,其子树排名序列为2、5、3。根据Ci=2的定义,节点4应插入排名5后面。递归插入过程
通过递归的方式将所有节点按照规则插入到各自的排名序列中。确保每一步插入操作均符合Ci的定义,避免违反权值关系。代码实现
#include#include using namespace std;const int maxn = 2e4 + 1;int n, a, root, num[maxn], ans[maxn];vector > v(maxn + 1);void dfs(int x) { vector temp; for (int to : v[x]) { temp = dfs(to); for (int val : temp) { rank.push_back(val); } } if (num[x] > rank.size()) { printf("NO"); exit(0); } rank.insert(rank.begin() + num[x], x); return rank;}int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d %d", &a, &num[i]); if (a == 0) { root = i; } else { v[a].push_back(i); } } vector range = dfs(root); // 以下为权值序列生成逻辑 }
代码解释
递归函数dfs
节点插入
在返回路径时,根据节点的Ci值(num[x])插入到当前排名序列的适当位置。确保插入位置不违反权值关系。主程序逻辑
读取输入数据,初始化节点信息。调用DFS构造权值序列。通过递归插入,生成最终的权值序列。这种方法确保了每个节点的权值与其子树排名关系准确无误,符合Ci的定义。通过DFS递归实现,保证了代码的高效性和正确性。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月11日 23时26分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
2019-03-06
Android MediaPlayer setDataSource failed
2019-03-06
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2019-03-06
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2019-03-06
大前端的自动化工厂(1)——Yeoman
2019-03-06
数据仓库建模方法论
2019-03-06
虚拟机搭建hadoop环境
2019-03-06
DataStax Bulk Loader教程(四)
2019-03-06
.NET应用框架架构设计实践 - 概述
2019-03-06
Rust 内置 trait :PartialEq 和 Eq
2019-03-06
Hibernate(十四)抓取策略
2019-03-06
[菜鸟的设计模式之旅]观察者模式
2019-03-06
Spring-继承JdbcDaoSupport类后简化配置文件内容
2019-03-06
Java基础IO流(一)
2019-03-06
Hibernate入门(四)---------一级缓存
2019-03-06
MySQL事务(学习笔记)
2019-03-06
一个web前端开发者的日常唠叨
2019-03-06
内存分配-slab分配器
2019-03-06
技术写作技巧分享:我是如何从写作小白成长为多平台优秀作者的?
2019-03-06