思路:
数据量还算比较小, 都是100
答案 最多不超过 100w,
因此 可以dp[i][j] 表示 前i 个数能否构成j
用个bitset优化一下就很快了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <bitset>
#include <iostream>
using namespace std;
bitset<1000000+10>dp[100 + 10];
int main(){
int n;
// scanf("%d",&n);
dp[0][0] = 1;
scanf("%d",&n);
for (int i = 1; i <= n; ++i){
int a,b;
scanf("%d %d",&a, &b);
for (int j = a; j <= b; ++j){
dp[i] |= dp[i-1] << j*j;
}
}
printf("%d\n", dp[n].count());
return 0;
}
题目描述
一共有 n个数,第 i 个数 xi 可以取 [ai,bi] 中任意值。
设 S=∑xi2,求 S 种类数。
输入格式
第一行一个数 n。
然后 n 行,每行两个数表示 ai,bi。
输出格式
输出一行一个数表示答案。
样例
样例输入
5
1 2
2 3
3 4
4 5
5 6
样例输出
26
数据范围与提示
1≤n,ai,bi≤100