luogu P8367 [LNOI2022] 盒
比较厉害的题目。
首先我们发现我们只需要计算 \(i\) 和 \(i+1\) 之间经过的货物数,也即设 \(a\) 的前缀和为 \(Sum\) ,\(b\) 的前缀和为 \(c\),则 \(i\to i+1\) 经过的货物数量就是 \(|Sum_i-c_i|\),价值就是 \(|Sum_i-c_i|w_i\)。
我们现在已经知道 \(Sum\) 了,不妨枚举 \(c\) 。容易发现方案数就是前 \(i\) 个放 \(c_i\) 个,后 \(n-i\) 个放 \(S-c_i\) 的方案数。答案也就是 \(\sum\limits_{i=1}^{n-1}{w_i\sum\limits_{j=0}^{S}{|Sum_i-j|{i+j-1\choose i-1}{n-i+S-j-1\choose S-j}}}\)
外面的 \(w\) 可能不一样,因此我们考虑对于每个 \(i\) ,求出里面这个式子。
显然先把绝对值给卸了。这里就讨论 \(Sum_i\leq j\) 的情况,另一部分同理。
然后列出来,把里面的 \(j\) 消掉,就变成
你发现其实后面这个和前面这个是很类似的,不妨设 \(F(i,Sum_i,n,S)=\sum\limits_{j=0}^{Sum_i}{{i+j-1\choose i-1}{n-i+S-j-1\choose S-j}}\),那么式子可以变成 \(Sum_iF(i,Sum_i,n,S)-iF(i+1,Sum_i-1,n+1,S-1)\)。我们只需要考虑 \(F\) 的计算。
假设所有 \(i\) 都相等,那么这个其实是平凡的。每次只需要暴力移动 \(Sum_i\) 即可,均摊是 \(O(S)\) 的。如果我们有一种能 \(O(1)\) 移动 \(i\) 的方法,那么求 \(F\) 就不再困难。
直接对着这个式子化肯定不行。考虑其组合意义,你会发现就是在 \(n+S-1\) 的盒子上放 \(n-1\) 个球,每个盒子只能放一个,且第 \(i\) 个球不能超过 \(i+Sum_i\) 的方案数。
这还有另一种计算方法:枚举 \(j\in [i,n-1]\) 表示在 \(i+Sum_i\) 范围内的球的个数。容易得到式子:
只要让 \(i\to i+1,Sum\to Sum-1\),就可以 \(O(1)\) 实现将 \(i\) 变大。
然后另一边干同样的事情即可,时间复杂度 \(O(T(n+S))\)。