DP 题。
设 \(f_{i ,j}\) 为前 \(i\) 个数能否凑出 \(j\),转移即为:
\[f_{i ,j} \gets f_{i ,j} \ \operatorname{or}\ f_{i ,j - k^2} \left( a\le k \le b\right)
\]
时间复杂度为 \(\mathcal O(n^5)\)。
注意这个式子只有或运算,且可以轻松用 bitset 优化,直接用即可(f[i] |= f[i - 1] << (k * k)),时间复杂度为 \(\mathcal O(\frac{n^5}{w})\)。
namespace lolcrying {signed main() {n = read();f[0].set(0);up(i, 1, n) {int l = read(), r = read();up(j, l, r)f[i] |= (f[i - 1] << (j * j));}writeln(f[n].count());return 0 ;
}