LibreOJ β Round #2 B.贪心只能过样例【Dp+bitset优化】

来源:互联网 发布:线性代数中矩阵求模 编辑:程序博客网 时间:2024/06/06 06:47

B. 贪心只能过样例

内存限制:256 MiB时间限制:1000 ms标准输入输出
题目类型:传统评测方式:文本比较
转到题库提交记录返回比赛

题目描述

一共有 nnn个数,第 iii 个数 xix_ixi 可以取 [ai,bi][a_i , b_i][ai,bi] 中任意值。
设 S=∑xi2S = \sum{{x_i}^2}S=xi2,求 SSS 种类数。

输入格式

第一行一个数 nnn
然后 nnn 行,每行两个数表示 ai,bia_i,b_iai,bi

输出格式

输出一行一个数表示答案。

样例

样例输入

51 22 33 44 55 6

样例输出

26

数据范围与提示

1≤n,ai,bi≤1001 \le n , a_i , b_i \le 1001n,ai,bi100


思路:


暴力Dp转移需要O(n^5)的时间复杂度。

考虑到这是类似一个背包的状态,我们设定dp【i】就是一个bool数组,表示i这个数字能否凑出来。

那么对应我们可以O(n^5/64)用bitset优化一下常数。


#include<stdio.h>#include<string.h>#include<bitset>#include<iostream>using namespace std;int L[150];int R[150];bitset<1000050>a,b,tmp;int main(){    int n;    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++)scanf("%d%d",&L[i],&R[i]);        a.reset();        b.reset();        for(int i=L[1];i<=R[1];i++)        {            a[i*i]=1;        }        for(int i=2;i<=n;i++)        {            b.reset();            for(int j=L[i];j<=R[i];j++)            {                tmp.reset();                tmp=a<<(j*j);                b=(b|(tmp));            }            a=b;        }        printf("%d\n",a.count());    }}






阅读全文
0 0
原创粉丝点击