子树的大小-面包卷卷的代码
5503查看
面包卷卷
2024-03-05 20:09

解题思路

免费领取的VIP的视频题解解法

import os
import sys

t = int(input())

for _ in range(t):
    # 第k个结点的子节点范围为[k*m-m+2,k*m+1]
    n,m,k = map(int,input().split())
    l=k   # 表示子节点的左端点 
    r=k   # 表示子节点的右端点
    ans = 1   # 记录总的结点的数量
    res = 1   # 记录每一层子结点的数量
    while r*m+1 <=n:  # 如果子节点最右端小于n  说明没到尽头
        res *= m      # 计算出这一层的所有子节点数目
        l = l*m-m+2   # 更新左端点
        r = r*m+1     # 更新右端点
        ans +=res     # 更新总端点数目
    l=l*m-m+2 # 最后一层最左端点
    ans+=max(0,n-l+1)  # 最后一层最右端点就是n,直接用n-l+1计算出这层的结点数量
    print(ans)
copy
#题解
全部回复(12)
lanqiao6299128598
2024-03-07 18:30

谢谢你,好心人

回复
lanqiao6763089046
2024-03-08 14:28

怎么领视频呢

回复
lanqiao2307027602
2024-03-15 21:29

太牛了,好棒

回复
XuperMan
2024-04-04 01:03

第k个节点的子节点范围怎么推的啊...考试过程中想不到哇QAQ

回复
皮痒痒
回复
2024-04-07 16:48

只能自己去发现了,我也感觉有点无力

回复
lanqiao2168697399
2024-04-11 09:41

完全二叉树 满二叉树这些都是有规律的,一看就是数据结构没好好学 /狗头

回复
又双叕TLE了
2024-05-17 20:17

打表推一下

回复
lanqiao0539095478
2024-09-04 22:53

!!!!nb!

回复
lanqiao5714069901
2025-03-06 22:02

太牛了哥!

回复
zzk只求省一
2025-03-13 21:12

nb66666666

回复
lanqiao2621726954
1 天前

为什么去掉max之后一个都不通过啊?

回复
lanqiao1590375940

样例大概都是起始点和终止点不在同一棵子树上,例如, n = 10,m = 4,k = 2,最后的结果就会导致n-l+1小于0,这个时候下一层就不能取了,只能加上0

回复
你的回复