数位 dp.
假定有一棵插入了 $[0,m]$ 内所有数的 01 Trie 树,我们可以在上面做简单的 dp 求出答案.
设 $f(x,l,r)$ 表示把 $[l,r]$ 内所有的 $b$ 都分配入 $x$ 的子树中能产生的最大贡献.
转移时枚举将 $[l,k]$ 内的 $b$ 分入 $x$ 左子树中, $[k+1,r]$ 内的 $b$ 分入 $x$ 右子树中.
$$
f(x,l,r) =\max_{l-1\le k\le r} f(x_{lson},l,k) + f(x_{rson},k+1,r)+\sum_{i=k+1}^r a_i
$$
但这棵 Trie 树的节点数目是 $O(m)$ 的,直接这样 dp 不可行.
注意到除去从 $m$ 到根这条链上的点,其它点的每个子树都是完全二叉树.
于是 dp 只需要记录当前节点深度,以及是否在从 $m$ 到根的链上.
其实这东西就是个数位 dp, 深度表示考虑到了哪一位,是否在链上表示是否顶住了上界.
用 Trie 树的形式可能比较容易理解贡献的计算.
时间复杂度 $O(n^3\log m)$ .
1 | //%std |