简单瞎搞题
题意:
给定n个区间,从[l,r]区间中任选一个整数。求
∑
i
=
1
n
x
[
i
]
2
\sum_{i = 1} ^ {n} x[i] ^ 2
∑i=1nx[i]2的种类数。
n
<
=
100
,
1
<
=
l
<
=
r
<
=
100
n <= 100,1 <= l <= r <= 100
n<=100,1<=l<=r<=100
思路:
一眼分组背包。
f[i][j]:从前i个中选是否能组成j的集合。
属性:true / false
那么答案为f[n][1—1e6], O(1e2 * 1e6 * 1e2)铁T
发现求种类数。有多少种可能性。考虑是否可以用神奇的bitset优化!
sum总和为1e6,可以开1e6的bitset
bitset< >f[i]: 从前i个中选,sum的可能性的集合。
假设选值为k
f
[
i
]
=
f
[
i
−
1
]
<
<
(
k
∗
k
)
f[i] = f[i - 1] << (k * k)
f[i]=f[i−1]<<(k∗k)
那么时间复杂度为大概在3e8。
code:
typedef pair <int, int> PII;
bitset <maxn> f[110];
int main()
{
int n;
scanf("%d", &n);
for(int i = 1 ; i <= n ; i ++)
{
int l, r;
scanf("%d %d", &l, &r);
for(int j = l ; j <= r ; j ++)
{
if(i == 1)
{
f[i][j * j] = 1;
}
else
{
f[i] |= f[i - 1] << (j * j);
}
}
}
printf("%d\n", f[n].count());
return 0;
}