参考文章:https://blog.csdn.net/bobodem/article/details/51212888
构造函数
bitset<n> b;
b有n位,每位都为0.参数n可以为一个表达式.
如bitset<5> b0;则"b0"为"00000";
bitset<n> b(unsigned long u);
b有n位,并用u赋值;如果u超过n位,则顶端被截除
如:bitset<5>b0(5);则"b0"为"00101";
bitset<n> b(string s);
b是string对象s中含有的位串的副本
string bitval ( "10011" );
bitset<5> b0 ( bitval );
则"b0"为"10011";
bitset<n> b(s, pos);
b是s中从位置pos开始位的副本,前面的多余位自动填充0;
string bitval ("01011010");
bitset<10> b0 ( bitval, 3 );
则"b0" 为 "0000011010";
bitset<n> b(s, pos, num);
b是s中从位置pos开始的num个位的副本,如果num<n,则前面的空位自动填充0;
string bitval ("11110011011");
bitset<6> b0 ( bitval, 3, 6 );
则"b0" 为 "100110";
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流 |
看道题目:
牛客练习赛22 C 简单瞎搞题
https://www.nowcoder.com/acm/contest/132/C
题目描述
一共有 n个数,第 i 个数是 xi
xi 可以取 [li , ri] 中任意的一个值。
设 ,求 S 种类数。
输入描述:
第一行一个数 n。 然后 n 行,每行两个数表示 li,ri。
输出描述:
输出一行一个数表示答案。
示例1
输入
复制
5 1 2 2 3 3 4 4 5 5 6
输出
复制
26
备注:
1 ≤ n , li , ri ≤ 100
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
bitset <100010> b,t;
int main()
{
int n;
while(~scanf("%d",&n))
{
b[0]=1;
for(int i=1;i<=n;i++)
{
int lr,ur;
scanf("%d%d",&lr,&ur);
t.reset(); ///全部置0
for(int j=lr;j<=ur;j++)
{
t|=(b<<j*j); ///位运算
}
b=t;///滚动数组赋值
}
printf("%d\n",b.count());
}
return 0;
}
举个例子:这里就不平方了,[1,2] ,[2,3]
那就首先第一组,变为000110
第二组为(011000|110000)->(111000) 故是三种。
你看 第一个加粗的1,是先往左移2个,再往左移2个,得到的位置
第二个加粗的1,是先往左移1个,再往左移3个,得到的位置
再或运算,故的结果。