HDU 5573 Binary Tree 2015上海现场赛B题

该博客介绍了如何解决一个关于完全二叉树的问题,其中涉及从根节点开始按特定步数行走并选择加减节点标号,以达到目标数值N的路径计算。通过使用二进制表示取数方法和节点位置,利用动态规划策略确定最优路径,并给出O(k^2)复杂度的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
有一个深度无限的完全二叉树,每个节点有一个标号:根节点标号为1,之后对于标号为x的节点,左孩子标号为2x,右孩子标号为2x+1(其实就是zkw线段树的标号规则)。现在从根节点开始向下走k步(根节点也算一步),每到一个节点可以选择加上或减去节点的标号,求最终结果为N的走法,其中N>=1且题目保证有解。

思路:
首先,我们用二进制数mask表示取数的方法,1表示+,0表示-,顺序从左向右,最右一位表示最后一次取数的方法;用pos表示最后到达节点的标号。这样就可以唯一确定一种走法,且很容易写出计算最终结果的函数f(mask,pos)。如k=3,mask=5,pos=7表示的路径为1 +,3 -,7 +,f(5,7)=5。
为方便表述再定义F(mask,x,pos,y)为mask右x位确定,pos左y位确定后,f的取值范围

经过观察很容易得到以下结论

  • 最后一个节点取法一定为+,即mask&1=1
  • 在k确定,后x步取法确定(即mask的右x位确定),前y步走法(即pos前y位确定)的情况下,f取值连续,且当所有未确定位全部置0时取得最小值

根据上述条件,只需依次确定mask和pos的值就可以得到答案

初状态mask最右位必然为1,pos最左位必然为1外其它位均未确定,根据题目限制N必包含在取值范围中,即F(1,1,1 << k,1)包含N

1.确定mask
从右向左依次确定mask,比如当前已确定前i位(mask其它位全部置0),则
F(mask,i,1<< k,1)最小值为f(mask,1<< k)
检查f(mask^(1<< i),1<< k))是否大于N,如果不大于N,则F(mask^(1<< i),i+1,1<< k,0)必包含N,否则F(mask,i+1,1<< k,0)必包含N

2.确定pos
此时mask已确定
从左向右依次确定pos,比如已确定前i位(pos其它位全部置0),则
F(mas

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值