正难则反,考虑计数贪心错误的情况,可以发现在 $w_i \leq 2$ 的前提下,有且仅有两种情况:
- 在剩余金钱 $m=2$ 时,先购买了一个 $w_i=1$ 的物品 $a_i$,导致没能购买另一个 $w_j=2$ 的物品 $a_j$。其中需要满足 $a_j > a_i$。
- 在剩余金钱 $m=2$ 时,先购买了一个 $w_i=1$ 的物品 $a_i$,导致没能购买另一个 $w_j=2$ 的物品 $a_j$,但再之后又购买了一个 $w_k = 1$ 的物品 $a_k$。其中需要满足 $a_j > a_i + a_k$。
其中情况 $1$ 可以看作情况 $2$ 的子情况。
满足条件的 $a_j$ 可能有多个,其中我们只考虑 $a_j$ 最大的一个,如果 $a_j$ 相同则只考虑 $j$ 最小的一个。为方便,下面假设 $(a_i, i) > (a_j,j)$ 当且仅当 $a_i > a_j$ 或者 $a_i = a_j \land i < j$。
考虑枚举 $i,j$ 满足 $a_j < 2 a_i$ 并钦定 $w_i=1,w_j=2$,计算在剩余的 $2^{n-2}$ 种 $w_i$ 安排方案中能够发生贪心错误的数量。对另外的物品 $a_k$ 进行分类讨论:
- $(a_j, j) < (a_k, k) $:此时 $w_x$ 取任意值都会被选取。其贡献写成生成函数为 $G_k(x)=x^2+x=x(x+1)$。
- $(a_i, i) < (a_k, k) < (a_j, j)$:此时 $w_x =1$ 时会被选取,$w_x=2$ 时则因为性价比低于 $a_j$ 不会被考虑。其贡献写成生成函数为 $G_k(x)=x+1$。
- $(a_j - a_i, n + 1) < (a_k, k) < (a_i, i)$:此时 $w_x=1$ 时会导致 $a_i + a_k \ge a_j$ 使得贪心正确,$w_x = 2$ 时则不会被选取。其贡献写成生成函数为 $G_k(x)=1$。
- $(a_k,k) < (a_j - a_i, n + 1)$:此时 $w_x$ 取任意值都不会被选取。其贡献写成生成函数为 $G_k(x)=2$。
令 $F(x)=\prod_k G_k(x)$。因为我们要在扫描到 $i$ 时恰好 $m=2$,因此方案数应该为 $[x^{m-2}]F(x)$。不难发现 $F(x)$ 可以写成 $2^c x^p (x+1)^q$ 的形式,方案数即为: $$ \binom{q}{m-2-p} \cdot 2^c $$。
故我们枚举 $i,j$,并利用双指针扫描线实时更新 $c,p,q$ 的值。总时间复杂度 $O(n^2)$。