CF301D Yaroslav and Divisors
因为是排列,所以数对总数是调和级数 \(O(n\log n)\)。
如果按照常规的数对容斥,左右端点均在 \([l,r]\) 中的数对数量等于左右端点均在 \([1,r]\) 中的数对数量减去左右端点均在 \([1,l-1]\) 中的数对数量,再减去左端点在 \([1,l-1]\) 中且右端点在 \([l,r]\) 中的数对数量。
但是考虑到枚举形式是先枚举较小数再枚举它的倍数,我们不得不考虑左右端点的相对大小。容易维护的是较小数在序列的当前前缀,较大数的位置。
那么我们的容斥就应该改成较小数在 \([1,r]\) 中较大数在 \([l,r]\) 中的数对数量减去较小数在 \([1,l-1]\) 中较大数在 \([l,r]\) 中的数对数量。
树状数组即可。开两个 vector,把询问编号分别挂在左右端点上会好写很多。

浙公网安备 33010602011771号