实质是一个背包 对于一个数 我们只需要知道能否表示它 即0和1的状态 所以用bitset来优化
当前状态由上一个状态转移过来
#include <bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned long long #define mes(x,a) memset(x,a,sizeof(x)); #define sca(a) scanf("%d",&a) #define lowbit(x) x & (-x) #define mk make_pair #define pb(x) push_back(x) #define all(x) (x).begin(),(x).end() #define fi first #define se second #define lson v << 1 #define rson v << 1 | 1 #define pii pair<int, int> const int N = 1e9; const int M = 1e7+5; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; const double E = 2.7182818284590452353; bitset <1000005> dp[105]; int n,l,r; int main() { cin >> n ; dp[0][0] = 1; for(int i = 1;i <= n;i ++){ cin >> l >> r; for(int j = l;j <= r;j ++){ dp[i] |= (dp[i - 1] << (j * j)); } } cout << dp[n].count() << '\n'; return 0; }