C.简单瞎搞题
链接:https://www.nowcoder.com/acm/contest/132/C
来源:牛客网题目描述
一共有 n个数,第 i 个数是 x
i
x
i 可以取 [l
i , r
i] 中任意的一个值。
设
,求 S 种类数。
输入描述:
第一行一个数 n。 然后 n 行,每行两个数表示 li,ri。
输出描述:
输出一行一个数表示答案。
//bitset快速的位运算符类似,不过他是真的每一位都是0,1,
//本题中最大总和为1e6,那么就可以开一个1e6大小的bitset,第i为代表i这个数是否可以被组成
//bit.reset()全部变0,bit.count()有几个1,
//bitset可以节省内存,1/64,可以节省时间,1/64
//一般1e7的数组int的话是32兆,用bool小4倍
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
bitset <maxn> a,b; //bitset开的是正常内存的1/64
int main()
{
int n;
scanf("%d",&n);
b[0]=1; //0是可以直接取到的,不能省略,否则答案永远为0
for(int i=1;i<=n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++) //能取的数是从l到r
{
a|=b<<(j*j); //bitset中<<是指向右移 是指>>向左移,与位运算相反
}
b=a; //滚动使用两个bitset
a.reset(); //全部填0
}
printf("%d\n",b.count()); //输出有几个1,就是所有可能,这是bitset的函数,复杂度为(长度/64)
return 0;
}