题意:
题解:分组背包复杂度O(1e10),bitset优化O(1e10/32)
bitset深入学习:C++ bitset 用法
代码:
/*
https://ac.nowcoder.com/acm/contest/16806/C:
要变强,不空喊,ak题目,继续向前。
1.数据范围较小,背包问题,复杂度1e2*log(1e2)*1e6
emmm写完才发现不是多重背包,而是分组背包,那么时间复杂度变成了1e2*1e2*1e6
2.试过优先队列,结果发现不是解决这个问题的。它解决的是,每组数去一个,mx-mi的最小值
3.直接搜索试试
4.bitset,这么好用emm
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 5;
const int M = 1e6 + 5;
int n, l, r;
bitset<M> ans, tmp; //初始时都为0,每次操作时间复杂度O(n/32)
signed main() {
cin >> n;
int i, j;
scanf("%d%d", &l, &r);
for (i = l; i <= r; i++) ans[i * i] = 1;
for (i = 2; i <= n; i++) {
scanf("%d%d", &l, &r);
tmp =
0; //初始化。不能为ans,因为它是每组取一个数,而不是所有组中取任意数
// cout << i << ' ' << tmp << endl;
for (j = l; j <= r; j++) tmp |= (ans << j * j);
ans = tmp;
}
//时间复杂度O(1e2*1e2*1e6/32),大概3e8
// cout << ans << endl;
cout << ans.count();
return 0;
}