[Codeforces 1286B] Numbers on Tree

2023-11-14

Evlampiy was gifted a rooted tree. The vertices of the tree are numbered from 1 to n. Each of its vertices also has an integer ai written on it. For each vertex i, Evlampiy calculated ci — the number of vertices j in the subtree of vertex i, such that a j < a i aj<ai aj<ai
在这里插入图片描述
Illustration for the second example, the first integer is ai and the integer in parentheses is ci
After the new year, Evlampiy could not remember what his gift was! He remembers the tree and the values of ci, but he completely forgot which integers ai were written on the vertices.

Help him to restore initial integers!

Input
The first line contains an integer n ( 1 ≤ n ≤ 2000 ) (1≤n≤2000) (1n2000) — the number of vertices in the tree.

The next n lines contain descriptions of vertices: the i-th line contains two integers pi and c i ( 0 ≤ p i ≤ n ; 0 ≤ c i ≤ n − 1 ) ci (0≤p_i≤n; 0≤c_i≤n−1) ci(0pin;0cin1), where pi is the parent of vertex i or 0 if vertex i is root, and ci is the number of vertices j in the subtree of vertex i, such that aj<ai.

It is guaranteed that the values of pi describe a rooted tree with n vertices.

Output
If a solution exists, in the first line print “YES”, and in the second line output n integers ai ( 1 ≤ a i ≤ 1 0 9 ) (1≤a_i≤10^9) (1ai109). If there are several solutions, output any of them. One can prove that if there is a solution, then there is also a solution in which all ai are between 1 and 1 0 9 10^9 109.

If there are no solutions, print “NO”.

Examples
inputCopy

3
2 0
0 2
2 0

outputCopy

YES
1 2 1 

inputCopy

5
0 1
1 3
2 1
3 0
2 0

outputCopy

YES
2 3 2 1 2

题意:

一刻n个点的有根树,每个节点有一个值 a i a_i ai
给出每个结点的祖先 f a fa fa f a fa fa为0代表这个点为根节点),以及子节点中 a j < a i a_j < a_i aj<ai的点的个数 c i c_i ci
需要构造的就是 a a a数组的值

对于需要构造的n个数,我们可以将其设为从1~n里面的数,而且为了消除相同的影响并方便构造,两两之间 a a a值不同
第一步我们可以找到每个节点为根的情况下,他的子树的结点的数量是多少通过dfs即可获得
对于一个点,如果他的 c i c_i ci甚至大于了他的子树中结点的个数,那么说这种就是不可能的情况,应该输出NO
其余的情况,一定是有一种解的
怎样构造出 a i a_i ai
首先我们可以用dfs的方式在对一个点 u u u进行操作的时候,我们求出所有没有被访问过的节点中的第 c [ u ] + 1 c[u]+1 c[u]+1个点 i i i,那么说就可以想象到 a [ u ] = i a[u] = i a[u]=i,然后继续dfs所连边即可

Code:

int n;
struct node{
	int to,nex;
}e[maxn];
int cnt,head[maxn];
void init(){
	cnt = 0;
	for(int i=1;i<=n;i++) head[i] = -1;
}
void add(int u,int v){
	e[cnt].to = v;
	e[cnt].nex = head[u];
	head[u] = cnt ++;
}
int root;
int fa,c[maxn];
int siz[maxn],a[maxn];
bool vis[maxn];
void dfs(int u) {
	int cnt = 0;
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		cnt ++;
		if(cnt == c[u] + 1) {
			vis[i] = 1;
			a[u] = i;
			break;
		}
	}
	for(int i=head[u];~i;i=e[i].nex) {
		int to = e[i].to;
		dfs(to);
	}
}
void get(int u) {
	siz[u] = 1;
	for(int i=head[u];~i;i=e[i].nex) {
		int to = e[i].to;
		get(to);
		siz[u] += siz[to];
	}
}
int main() {
	n = read;
	init();
	for(int i=1;i<=n;i++) {
		fa = read,c[i] = read;
		if(fa == 0) {
			root = i;
			continue;
		}
		add(fa,i);
	}
	get(root);
	for(int i=1;i<=n;i++){
		if(c[i] >= siz[i]) {
			puts("NO");
			return 0;
		}
	}
	puts("YES");
	dfs(root);/// root vet
	for(int i=1;i<=n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}
/**


**/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Codeforces 1286B] Numbers on Tree 的相关文章

  • AtCoder Beginner Contest 212 D - Querying Multiset (优先队列+思维)

    链接 题意 三种操作 向队列中放入一个x 将队列中的数都 x 拿出队列中最小的数 并输出 分析 首先我们知道本题的难点在于维护每次给队列中的数 x因为队列中的数加入的顺序不一样 所以第2种对队列中的贡献有的多有的少 我说的不太清楚 谨慎理解
  • 统计封闭岛屿的数目

    1254 统计封闭岛屿的数目 关于岛屿的相似题目 岛屿数量 二维矩阵的dfs算法 封闭岛屿数量 二维矩阵的dfs算法 统计封闭岛屿的数目 统计子岛屿 不同岛屿的数量 class MaxAreaOfIsland floodFill 算法 12
  • Bracket Coloring

    Bracket Coloring 题意 给出一个括号序列 定义漂亮序列为匹配括号序列或者反转之后是匹配括号序列的序列 现在要求染色 使得相同颜色的括号组成漂亮序列 问最少需要多少种颜色即每个括号染的颜色 思路 这里可以用栈来匹配括号序列 因
  • 算法---LeetCode 200. 岛屿数量

    1 题目 原题链接 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成 此外 你可以假设该网格的四条边均被水包围 示例 1 输入 gr
  • 基础算法题——德邦国王(dfs、剪枝)

    德邦国王 题目还算中规中矩 就是剪枝比较麻烦 解题思路 dfs 剪枝 移动次数不超过设定值 M 若有解 则后面的步骤不可大于该解的值 不断查询完美矩阵与当前矩阵不同的个数 t t 1 为最快可将当前矩阵移动成完美矩阵的步数 若 t 1 已经
  • UVA12166 Equilibrium Mobile

    VJ传送门 一道思维题 刚开始看的时候没什么思路 在博客园上参考了大佬的解析 在这里总结一下 一 分析 这道题要求让天平平衡所需要的最小改动次数 至少有一个不变 我们可以先选定一个不变的基准 然后改变其他的秤砣 得到以此为基准的天平的总重量
  • 【2019年ICPC南昌网络赛】Distance on the tree【DFS+线段树合并(可持久化线段树)】

    题目链接 DSM Data Structure Master once learned about tree when he was preparing for NOIP National Olympiad in Informatics i
  • BZOJ4345 [POI2016]Korale

    在病房里日题真是一种独特的体验 首先考虑求第一问 我们先把所有元素排序 我们用优先队列维护选数的集合 对每个集合维护集合里的元素的和v和最后一个元素 即最大的元素 lst 初始的时候我们把只包含最小元素的集合推入队列 那么我们取出一个队头元
  • [Nowcoder

    题目描述 There s a new art installation in town and it inspires you to play a childish game The art installation consists of
  • [leetcode] 2039. 网络空闲的时刻

    题目链接 题意 给定一张n个点不含重边的无向图 点的编号从0开始到n 1 两点之间如果有连边 可以认为耗时为1秒 1 gt n 1的点都需要向0号点发送消息 从第0秒开始 在0号收到消息之后 会回复消息 从第一秒开始 如果1 gt n 1号
  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • 链式前向星存树图和遍历它的两种方法【dfs、bfs】

    目录 一 链式前向星存图 二 两种遍历方法 一 链式前向星存图 n个点 n 1条边 链式前向星把上面的树图存下来 输入 9 代表要存进去n个点 1 2 下面是n 1条边 每条边连接两个点 1 3 1 7 2 4 4 5 4 6 3 8 3
  • Fix a Tree【Codeforces 699 D】【dfs + 树的性质】

    Codeforces Round 363 Div 2 D 题意 有N个点 每个点i都有一个父节点p i 如果 i p i 则是说明i结点是根结点 现在我们给出这样的1 N的p i 这可能是不合法的 问 我们应该最少改变多少个使它变成一棵合法
  • Acwing 842. 排列数字

    dfs int u 搜索第u个位置上可以放哪个数字 include
  • [项目管理-27]:任务的目的,背后的原因是任务实施首要思考的问题。

    案例 无论是一个项目 还是一项任务 在实施之前 弄清楚原因 是项目经理必须有的思维模式 而不是无条件的盲目的执行 只有弄清楚目的和原因 才能在执行过程中 遇到问题时 发挥主观能动性 采用各种灵活变通的方法解决问题 最后确保项目的成功 另一方
  • 无向图染色问题-dfs剪枝

    无向图染色问题 问题描述 给定一个无向图 要求用最少的颜色将节点染色 限制是不能让相邻节点染上相同的颜色 算法 使用dfs 为节点分配不同的颜色进行尝试 计算每种分配所需的颜色数 最终进行回溯 取得最小的颜色数 代码 C include
  • 基于振动传感器数据构建预测性维护AI模型

    预测性维修 Predictive Maintenance 简称PdM 是以状态为依据 Condition Based 的维修 在机器运行时 对它的主要 或需要 部位进行定期 或连续 的状态监测和故障诊断 判定装备所处的状态 预测装备状态未来
  • DFS的个人理解和测试例题

    深度优先搜索 DFS 是一种搜索手段 可以理解为 它从某个位置 起点 开始 沿着一条路不断地向前走直到尽头 然后退后一步 去走其它没走过的路 没有的话 再退后一步 再去选择 直到找到目的地 终点 例如下图 从A 起点 开始走 先走ABD 在
  • [思维模式-15]:《复盘》-3- “行”篇 - 操作复盘- 个人复盘

    目录 前言 一 将军不是教出来的 而是打出来的 二 复盘是能力提升的有效方式 三 对什么进行个人复盘 1 新的事 2 重要的事 3 有价值的事 4 按照规范 惯例处置不太奏效的事件 未达预期的事 四 个人复盘的两种操作手法 1 自我简易复盘
  • 数据结构--树存储结构 & 深度优先遍历 & 广度优先遍历 通俗易懂

    树的概念 首先 树是一种常用的非线性数据结构 是以边 Edge 相连的节点 Node 的集合 每个节点存储对应的值 当存在子节点时与之相连 根节点 是树的首个节点 边 所有节点都由边相连 用于标识节点间的关系 叶子结点 树的末端节点 它们没

随机推荐

  • 基于YOLOv8模型和CrowdHuman数据集的行人检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要 基于YOLOv8模型和CrowdHuman数据集的行人目标检测系统可用于日常生活中检测与定位行人 Human 利用深度学习算法可实现图片 视频 摄像头等方式的目标检测 另外本系统还支持图片 视频等格式的结果可视化与结果导出 本系统采用
  • python 利用表格批量修改文件夹(包括子文件夹)下所有文件名

    首先是获得需要修改文件的路径放入xlsx中 我一般直接在系统的搜索框中搜索 然后全选复制路径 偷个小懒 也可以再写个自动遍历所有文件获取地址 点击这个复制路径即可复制全部选中文件的路径 直接复制在表格第一列即可 便于读取 然后按照自己实际的
  • SQL调优的几个方法

    1 为什么调优 好处是什么 SQL语句在编写之后 对于数据量较少的表基本没有什么性能上的需求 但是如果考虑到性能方面的话 SQL语句优化就是必须的 2 如何调优 调有点方法有哪些 1 对查询进行优化 应尽量避免全表扫描 首先考虑在where
  • node 版本管理器 --- Volta

    鲸腾FE 来自恒生鲸腾网络 是一支专注于 web 前端的开发团队 并在 web 前端领域积累了多年疑难问题解决经验 崇尚高效 优质 成长 自由 快乐 前言 在我们的日常开发中经常会遇到这种情况 手上有好几个项目 每个项目的需求不同 然而不同
  • uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    uniapp 原生安卓开发插件 module 以及android环境本地调试 1 开发前景 由于uniapp 框架的局限先 有很多功能不能如原生android开发使用顺畅 因此 需要使用插件进行辅助 再由uniapp引入插件 使得功能完善
  • Linux设备驱动开发详解总结(二)之并发与竞争

    转载地址 http blog csdn net lwj103862095 article details 8548500 Linux设备驱动中必须解决一个问题是多个进程对共享资源的并发访问 并发的访问会导致竞态 在当今的Linux内核中 支
  • Netty:ByteBuf写入数据、读出数据

    介绍 Netty的ByteBuf数据位置索引是从0开始的 类似于数组 getByte int index 从指定位置读出一字节 这个操作不会改变ByteBuf的readerIndex或者 writerIndex 的位置 这个操作也不受rea
  • Ubuntu16.04系统安装tensorflow(GPU)

    作者 冯拓 电脑配置如下 配置 HP Z820 CPU核心线程数和主频 intel xeon 至强 E 5 2620 2 0GHz 24 内存 64GB 硬盘 2TB 显卡 NIVDIA TITAN X 12GB 安装过程中使用的安装包 安
  • 用Java实现杨辉三角

    给定一个非负整数 numRows 生成 杨辉三角 的前 numRows 行 在 杨辉三角 中 每个数是它左上方和右上方的数的和 示例 1 输入 numRows 5 输出 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 示例 2
  • Go语言的大小写

    初学者经常犯Go大小写默认的错误 即在包外引用小写的常量 函数提示错误 对于刚接触Go语言的人会觉得莫明其妙 原因是 Go语言中 常量 函数的首字母大写表示对外公开的相当于Java的public 小写表示私有的相当于Java的private
  • Vue element 二级菜单绑定示例

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 element ui 中动态绑定二级菜单示例 1 视图绑定
  • 软考高项之风险管理-攻坚记忆

    软考高项之风险管理 攻坚记忆 一 项目风险管理概述 1 风险相关概念及性质 2 风险分类 二 风险管理的ITO 1 风险管理过程组 规划风险管理ITO 2 风险管理过程组 识别风险ITO 3 风险管理过程组 实施定性风险分析ITO 4 风险
  • Three.js 模型添加标签

    在很多的实际的项目中 你可能需要给一个Three js的模型添加标签 那么我们可以使用three js的精灵模型来表示 使用精灵模型表示一个模型对象的标签 那么精灵模型就要位于模型对象的附近 可以获得要标注模型的世界坐标 然后来设置精灵标签
  • java cron表达式 每天凌晨两点_定时任务的cron表达式

    前言 对于开发人员来说 在做项目的过程中或多或少都会用到定时任务 Java开发一般会用Spring Quartz xxl job Elastic job来做定时任务调度框架 不论使用哪种框架 定时任务表达式都是必不可少的 平时配置cron表
  • linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?

    首先 问题中描述的65535个连接指的是客户端连接数的限制 在tcp应用中 server事先在某个固定端口监听 client主动发起连接 经过三路握手后建立tcp连接 那么对单机 其最大并发tcp连接数是多少呢 如何标识一个TCP连接 在确
  • 动态规划(上)

    题目一 109 数字三角形 LintCode 分治 利用递归可以很快的写出程序 class Solution public int traverse vector
  • JavaScript读取json文件

  • push和pushl的区别

    AT T汇编中 命令中可以指定操作范围 如pushb是将一个byte压栈 而pushw就是将一个word压栈 同样pushl就是压栈long 也就是双字 esp指的是esp寄存器 已知是双字 而0xfffffff8 p 指的是一个内存空间
  • JVM垃圾回收机制GC理解

    目录 JVM垃圾回收 分代收集 如何识别垃圾 引用计数法 可达性分析法 引用关系四种类型 强 软 弱 虚 强引用 软引用 SoftReference 弱引用 WeakReference WeakHashMap 软引用与虚引用的使用场景 虚引
  • [Codeforces 1286B] Numbers on Tree

    Evlampiy was gifted a rooted tree The vertices of the tree are numbered from 1 to n Each of its vertices also has an int