B. 贪心只能过样例
内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述
一共有 n个数,第 i 个数 xi 可以取 [ai,bi] 中任意值。
设 S=∑xi2,求 S 种类数。
输入格式
第一行一个数 n。
然后 n 行,每行两个数表示 ai,bi。
输出格式
输出一行一个数表示答案。
样例
样例输入
5
1 2
2 3
3 4
4 5
5 6
样例输出
26
数据范围与提示
1≤n,ai,bi≤100
思路:
暴力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());
}
}