首页 > 其他分享 >F. 0, 1, 2, Tree!

F. 0, 1, 2, Tree!

时间:2025-01-11 14:29:59浏览次数:3  
标签:heapq top Tree 结点 heappush 构建 ans

题目链接:Problem - 1950F - Codeforces

题目大意:给定三个整数, a, b, c 。其中a是在一棵树上度为2的结点(既有左子树,右子树)的个数,b是度为1的结点的个数, c是叶子结点的个数。问这样的结点分布情况是否可以勾成一棵二叉树,如果可以,输出最小高度,不能输出-1。1<=a,b,c<=1e5, a+b+c>=1.

题目思路:该题首先判断是否可以构成一棵树,由通过不断地画二叉树可以知道,n2+1 == n0(二叉树的性质), 即题目中 a + 1 == c .接下来便是模拟构建树,便有了三种选择 先构建a, 然后b, 先b 后a, a 与 b 交叉构建。这里只有通过手玩模拟 , 可以发现  先用 a 后 b 构建出的树最小。    其实贪心的角度来想也是可以的, 如果先用 b, 则每一次的构建只能放在前一个结点的后面,树便会变高。  先用a的话 会在后面留两个 ‘ 尾巴 ’, 可以使得构建时横向发展,便会变矮。  实现过程中每一次构建要在最矮的地方进行构建, 可以使用 优先队列维护最小的值。

import heapq
from heapq import heappush

def solve() :
    a, b, c = map(int, input().split())
    q = list()
    heapq.heappush(q,0)  #采用优先队列
    ans = 0
    if a + 1 != c:
        print(-1)
        return
    while a>0:
        top = heapq.heappop(q)
        ans = max(top + 1, ans) #维护ans
        heapq.heappush(q,top+1) #有左右子树
        heapq.heappush(q, top + 1)
        a-=1
    while b>0:
        top = heapq.heappop(q)
        ans = max(top+1, ans)   #维护ans
        heapq.heappush(q, top+1) #只有一课树
        b-=1
    print(ans)

T = int(input())
while T:
    solve()
    T-=1


欢迎大佬指正, 感谢收看与点赞。

标签:heapq,top,Tree,结点,heappush,构建,ans
From: https://blog.csdn.net/king0304916/article/details/145076395

相关文章

  • [数据结构学习笔记11] 前序树(Trie/Prefix tree)
    前序树(Trie/Prefixtree),它的一个典型的应用场景在搜索引擎里,当你输入查询关键字的时候,会联想自动补齐你想要输入的内容。比如,你输入app,下面可能会出来联想Apple,Applied等等。什么是Trie?Trie(读作Try)是这样一个数据结构,它把短语或者单词分解字母,然后以一种方式去存储,让添加、删......
  • ubuntu 18.04下neovim手动添加treesitter支持(c语言为例)
    环境准备rustcurl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|shnode.jshttps://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-x64.tar.xzneovimhttps://github.com/neovim/neovim-releases/releases/download/v0.10.3/nvim-linux64.tar.g......
  • P9 CF2050G Tree Destruction
    CFRound991(div.3)G​ 十分经典的树形DP,但是我却对此十分畏惧...​ 这题思路上没什么好说的,很容易就能想到用DP。要说麻烦,主要可能就是理清树上的链和点之间的关系,方便构造转移方程。​ 对于以\(pos\)为根的子树,如果我们要找一条链在此子树中,那本质上就是两个状态:\(po......
  • Linux(Centos 7.6)命令详解:tree
    1.命令作用以树状格式列出目录的内容(listcontentsofdirectoriesinatree-likeformat);tree会递归显示子层目录下所有内容,但默认情况下不包括隐藏文件和目录2.命令语法Usage:tree[OPTION]... [<directorylist>]3.参数详解OPTION:-a,all显示所有文件和目录(包......
  • Window平台下 tree 命令使用
    需要安装TreeforWindows工具打开进入TreeforWindows页面,选择下载Binarieszip文件。解压压缩包,找到压缩包内的bin目录,可以看到tree.exe工具。打开需要导出的目录,在当前目录执行cmd命令,命令如C:\Users\***\Downloads\tree-1.5.2.2-bin\bin\tree.exe-L2,需要把路径......
  • [数据结构学习笔记8] 二叉查找树(Binary Search Trees)
    二叉查找树,它是一类特殊的二叉树,除了基本的二叉树规则外,还要满足:1.左边的子节点要小于父节点值2.右边的子节点要大于父节点值 图示:添加节点:        42       |   |      24  99      |    | ......
  • 虚树 Virtual Tree
    更新日志2025/01/07:开工。概念在很多树上问题中,我们会发现,实际需要的,只有几个关键点。那么我们就可以针对这些关键点进行操作。更具体地,建一棵规模更小的,但是仍能完成要求的浓缩过的树,即为虚树。思路简介首先,常识可得:除了关键点,关键点两两的\(\text{LCA}\)也需要储......
  • 树上启发式合并 DSU on Tree
    更新日志2025/01/07:开工。概念树上启发式合并,可以一定程度上减小合并操作的复杂度,或者保证正确性。思路对于每一个节点,我们都找出它的最重儿子,也就是子节点个数最多的儿子。如有多个,任选一个。首先统计其他轻儿子的答案(如果无需统计每个节点的答案,就不用了。)。下面正......
  • 605 [CF 609E] Minimum spanning tree for each edge
    //605[CF609E]Minimumspanningtreeforeachedge.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/981给定一张n个顶点m条边的带权无向简单图,顶点编号从1到n,对于每一条边请求出包含这条边的生成树......
  • [数据结构学习笔记6] 树(Trees)
    为什么要有树结构,我们日常生活中,有很多层级关系,比如家庭树,组织架构图等等。这些或许也能够用数组或者链表来表示,但是这个比喻很好,就好像我们用叉子和盘子也能喝汤,但总是不对劲儿,我们可以有更好的表示方式。 了解树的一些术语树是由一系列节点(node)和边(edge)相互关联构成的。孩......