题目描述:
一共有 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;
}