传送门:https://loj.ac/problem/515
【题解】
容易发现S最大到1000000。
于是我们有一个$O(n^2*S)$的dp做法。
容易发现可以被bitset优化。
于是复杂度就是$O(frac{n^2S}{32})$
然后……就过了
# include <bitset> # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int M = 1e6 + 10, N = 100 + 5; const int mod = 1e9+7; int n, a[N], b[N], cnt; bitset<1000001> f[2]; int main() { cin >> n; for (int i=1; i<=n; ++i) cin >> a[i] >> b[i]; int pre = 0, cur = 1; f[0][0] = 1; for (int i=1; i<=n; ++i) { f[cur].reset(); for (int j=a[i]; j<=b[i]; ++j) f[cur] |= (f[pre] << j*j); swap(cur, pre); } for (int i=0; i<=1000000; ++i) if(f[pre][i]) ++cnt; cout << cnt << endl; return 0; }