CF1329C Drazil Likes Heap
题目描述
Drazil 非常喜欢堆这个数据结构。因此他造了一段关于堆的题目:
有一个高度为 $h$ 的大根堆存储在数组内。具体情况如下:
这个堆中有恰好 $2 ^ h - 1$ 个正整数,这些正整数两两不同。这些数存储在数组 $a$ 内下标 $1$ 到 $2 ^ h - 1$ 的位置。对于任意的 $1 \lt i \lt 2 ^ h$,都有 $a[i] \lt a\left[ \left\lfloor \frac{i}{2} \right\rfloor \right]$。
现在我们想要减小这个堆的高度到 $g$,使得堆中恰好只有 $2 ^ g - 1$ 个数。为了减小高度,我们需要进行下述操作 $2 ^ h - 2 ^ g$ 次:
选择一个包含有一个元素的下标 $i$,然后用 $i$ 调用函数 $f$,函数 $f$ 定义如下:

注意如果 $a[i] = 0$,那我们认为下标 $i$ 不包含一个元素。
在所有操作后,剩下的 $2 ^ g - 1$ 个元素需要位于下标在 $1$ 到 $2 ^ g - 1$ 中的位置。现在 Drazil 想要知道,剩下的 $2 ^ g - 1$ 个数之和最小可能是多少。请计算这个最小的和,并找到一个能够达到最小值的操作序列。
输入格式
第一行输入一个整数 $t ~ (1 \le t \le 70\ 000)$,表示测试数据组数。
对于每组测试数据,输入两行。
第一行输入两个整数 $h, g ~ (1 \le g \lt h \le 20)$。
第二行输入 $n = 2 ^ h - 1$ 个两两不同的正整数 $a[1], a[2], \ldots a[n] ~ (1 \le a[i] \lt 2 ^ {20})$。对于所有 $i ~(2 \le i \le 2 ^ h - 1)~$,$a[i] \lt a\left[ \left\lfloor \frac{i}{2} \right\rfloor \right]$。
每组测试数据的 $n$ 之和不超过 $2 ^ {20}$。
输出格式
对于每组测试数据,输出两行。
第一行输出一个整数,表示使得堆的高度降低到 $g$ 后堆中元素之和的最小值。
第二行输出 $2 ^ h - 2 ^ g$ 个整数 $v_1, v_2, \ldots, v_{2 ^ h - 2 ^ g}$,表示在第 $i$ 步操作中调用了函数 $f(v_i)$。