题目大意
一棵
n
层的满二叉树,叶子从左到右编号为
现在你可以选择任意个非叶子节点,交换它们的左右儿子。
通过这种方式生成的所有序列
{A2n−1}
中,求
∑2n−2i=0WAi,Ai+1
的最小值。其中
W
是给定的
n<=9
思路
骗分算法
设
f(l,r,x,y)
表示
[l,r)
区间中,最左是数
x
,最右是数
f(l,r,x,y)=f(l,mid,x,a)+f(mid,r,b,y)+Wa,b
理论上界时间复杂度
O((25n))
正解
设
fi,j
表示当前要放第
i
个位置,前一个数是
假若直接枚举下一个取的数
k
,显然会有很多无效的状态。
哪些状态是有效的呢?
记lowbit=i&-i,则
那么
j
和
不难得出
k
的可取范围为
bg = (j^lowbit) & ~(lowbit-1)
en = bg + lowbit
理论时间复杂度上界 O(n3)