跳转至

最优二叉检索树

  • 参考时间限制:0.5 秒(参考环境:R30;仅供预估)
  • 实际时间限制:标准程序在目标评测环境中处理最慢正式测试文件的基准时间乘以 2,再按 0.5 秒向上取整。
  • 内存限制:128 MB

背景故事

检索系统保存一组按编号排序的条目。频繁访问的条目适合放在较浅的位置,但整棵树仍须满足二叉搜索树的顺序。请选择总代价最小的布局。

(本故事由GPT-6重写)

形式化问题描述

把编号 \(1,\ldots,n\) 各使用一次,组成一棵二叉搜索树:每个结点左子树的编号都小于它,右子树的编号都大于它。根的深度为一,孩子的深度等于父亲深度加一。

编号 \(i\) 的访问次数为 \(f_i\) ,总代价为 \(\sum_{i=1}^n f_i d_i\) ,其中 \(d_i\) 是它的深度。求最小总代价,并输出所有最优树中字典序最小的先序遍历。

先序遍历依次访问根、左子树和右子树。字典序按整数比较,第一个不同位置的编号较小者更小;不是按编号的十进制字符串比较。访问次数已包含整次检索的需求,不额外累加祖先的访问次数。

输入格式

第一行一个整数 \(n\) .第二行 \(n\) 个整数 \(f_1,\ldots,f_n\) .

输出格式

第一行输出最小总代价。第二行输出最优树中字典序最小的先序遍历,相邻编号以空格分隔。

样例 1

输入

3
2 10 2

输出

18
2 1 3

解释

以二号结点为根,总代价为 \(10+2\cdot2+2\cdot2=18\) .

圆圈标明结点编号,旁边列出频次和深度。

圆圈标明结点编号,旁边列出频次和深度。

样例 2

输入

4
0 0 0 0

输出

0
1 2 3 4

解释

所有树的代价都是零;从一号结点开始的全右链给出最小先序序列。

样例 3

输入

1
1000000000

输出

1000000000
1

解释

唯一结点的深度为一。

数据范围与保证

\(1\le n\le500\) ;\(0\le f_i\le10^9\) .所有输入均为整数;零次访问的条目也必须出现在树中。

数据规格由 Codex(GPT-6)补齐:确定上述规模、非负访问次数和零权值边界,并提供对应测试分组。

数据分组

分值比例 额外条件
20% \(n\le9\)
30% \(n\le100\)
50% 无额外条件

参考评测环境与测量