简单瞎搞题

简单瞎搞题

题意:

给定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[i1]<<(kk)
那么时间复杂度为大概在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值