题目描述:
一共有 n个数,第 i 个数是 xi
xi 可以取 [li , ri] 中任意的一个值。
设S=∑xi2,求 S 种类数。
输入描述:
第一行一个数 n。
然后 n 行,每行两个数表示 li,ri。
输出描述:
输出一行一个数表示答案。
思路:
其实是个背包。有n个组,每组选一个数,问最后背包能装的体积有多少种方案。
直接分组背包求解的话。n组,每组最多n个数,最大体积为n^3,复杂度为n^5,显然会TLE。
所以考虑用bitset优化,复杂度为
#include<bits/stdc++.h>
using namespace std;
bitset<1005000> a,b;
int main(){
int n;cin>>n;
a[0]=1;
while(n--){
int l,r;
cin>>l>>r;
b.reset();
for(int i=l;i<=r;i++) b |= a<<i*i;
a=b;
}
cout<<a.count();
return 0;
}顺手写了一发dp的tle代码
#include<bits/stdc++.h>
using namespace std;
bool dp[1000005];
int main()
{
dp[0]=1;
int n;
cin>>n;
int flag=0;
while(n--)
{
int l,r;
cin>>l>>r;
for(int i=1000000;~i; i--)
{
if(dp[i])
{
for(int j=l; j<=r; j++)
{
dp[i+j*j]=1;
}
dp[i]=0;
}
}
}
int ans=0;
for(int i=1; i<=1000000; i++)
ans+=dp[i];
cout<<ans;
return 0;
}
京公网安备 11010502036488号