链接:
https://www.nowcoder.com/acm/contest/132/C
来源:牛客网
来源:牛客网
题目描述
一共有 n个数,第 i 个数是 x
i
x
i
可以取 [l
i , r
i] 中任意的一个值。
设
,求 S 种类数。
输入描述:
第一行一个数 n。 然后 n 行,每行两个数表示 li,ri。
输出描述:
输出一行一个数表示答案。
#include "bits/stdc++.h"
#define maxx 1000009
using namespace std;
bitset<maxx>dp[105];
int main(){
int n,l,r;
cin>>n;
dp[0][0]=1;
for(int i=1;i<=n;i++){
cin>>l>>r;
dp[i].reset();
for(int j=l;j<=r;j++){
dp[i]=dp[i]|(dp[i-1]<<j*j); //左移动j*j,相当于加上j*j(位置往前移动j*j位)
}
}
cout<<dp[n].count()<<endl;
return 0;
}
遍历每个区间的值,使他们相加,从0个位置开始,数组中的第i位表示为可组成的数i,将第i位置0【可组成的数=1所在的位置数】,用count()计算出bitset里面含有的1的个数,则是可以组成的所有数的个数
初始化bitset对象的方法
bitset<n> b; | b有n位,每位都为0 |
bitset<n> b(u); | b是unsigned long型u的一个副本 |
bitset<n> b(s); | b是string对象s中含有的位串的副本 |
bitset<n> b(s, pos, n); | b是s中从位置pos开始的n个位的副本 |
bitset操作
b.any() | b中是否存在值为1的二进制位? |
b.none() | b中不存在值为1的二进制位吗? |
b.count() | b中值为1的二进制位的个数 |
b.size() | b中二进制位的个数 |
b[pos] | 访问b中在pos处的二进制位 |
b.test(pos) | b中在pos处的二进制位是否为1? |
b.set() | 把b中所有二进制位的值为1 |
b.set(pos) | 把b中在pos处的二进制位值为1 |
b.reset() | 把b中所有二进制位的值为0 |
b.reset(pos) | 把b中在pos处的二进制位值为0 |
b.flip() | 把b中所有二进制位逐位取反 |
b.flip(pos) | 把b中在pos处的二进制位取反 |
b.to_ulong() | 用b中同样的二进制位返回一个unsigned long值 |
os << b | 把b中的位集输出到os流 |