ABC269 F~G
F:
我的做法比较繁琐,我维护的是白色点的权值和减去黑色点的权值和,还要求出整个矩阵的和。
可以参考一下,Code。
翻了翻题解,似乎大部分人的做法都是求出询问矩阵第一行和第二行白色点的权值和,然后直接等差数列就好了,这种做法较为简洁,可以看这个。
G:
首先很显然想到背包,每个物品的体积为 \(d_i=b_i-a_i\),代价为 \(1\),那么就是求出凑出每个体积的最小代价,初值为 \(f_{cur}=0\),其余均为 \(\infty\),其中 \(cur=\sum_{i}a_i\)。
但是很显然,如果直接背包的复杂度是 \(\mathcal O(nm)\)。
性质 \(1\):\(\sum \left|d_i\right|\le m\)。
证明:\(\sum \left|d_i\right|=\sum\left|b_i-a_i\right|\le \sum a_i+\sum b_i=m\)。
性质 \(2\):\(\left|d_i\right|\) 的种类是 \(\mathcal O(\sqrt m)\)。
证明:很显然,因为 \(1+2+\cdots+\sqrt m=\mathcal O(m)\)。
那么把体积相同的物品看成一种,这就是一个多重背包问题,只有 \(\mathcal O(\sqrt m)\) 种物品。
可以用二进制优化或单调队列优化。
但是这里比较特殊,二进制优化比单调队列优化快,还好写。
官方题解里提到当 \(\sum a_i\le n\) 时,\(\sum a_i\log a_i\) 是 \(\mathcal O(n\sqrt n)\) 级别的。
所以时间复杂度 \(\mathcal O(m\sqrt m)\)。