看这题名字挺优美就去做了,结果一眼秒掉(虽然写错了一次)……
设 fi 表示 [1,i] 的划分方案数,有 fi=∑0≤j<i[|(sum0,i−sum0,j)−(sum1,i−sum1,j)|≤k]fj。
|(sum0,i−sum0,j)−(sum1,i−sum1,j)|≤k−k≤(sum0,i−sum0,j)−(sum1,i−sum1,j)≤k⇓sum0,i−sum0,j≤sum1,i−sum1,j+ksum0,i−sum0,j≥sum1,i−sum1,j−k⇓sum0,i−sum1,i−k≤sum0,j−sum1,jsum0,i−sum1,i+k≥sum0,j−sum1,j
然后这个条件就变成了二维偏序,用树状数组按照 sum0,i−sum1,i 来维护即可。
注意要整体移动 n 位,避免负数。
代码:
1 |
|