bitset
bitset
了解
1.bitset的定义和引用
1.bitset定义:
其实就是相当于一个不定长度数组,数组里面只有01并且支持各种位运算
2.引用
bitset<你要的二进制长度> bs;
2.bitset的用法
bitset支持各种位运算
bitset<4> foo (string("1001"));
bitset<4> bar (string("0011"));
cout << (foo^=bar) << endl; // 1010 (foo对bar按位异或后赋值给foo)
cout << (foo&=bar) << endl; // 0010 (按位与后赋值给foo)
cout << (foo|=bar) << endl; // 0011 (按位或后赋值给foo)
cout << (foo<<=2) << endl; // 1100 (左移2位,低位补0,有自身赋值)
cout << (foo>>=1) << endl; // 0110 (右移1位,高位补0,有自身赋值)
cout << (~bar) << endl; // 1100 (按位取反)
cout << (bar<<1) << endl; // 0110 (左移,不赋值)
cout << (bar>>1) << endl; // 0001 (右移,不赋值)
cout << (foo==bar) << endl; // false (0110==0011为false)
cout << (foo!=bar) << endl; // true (0110!=0011为true)
cout << (foo&bar) << endl; // 0010 (按位与,不赋值)
cout << (foo|bar) << endl; // 0111 (按位或,不赋值)
cout << (foo^bar) << endl; // 0101 (按位异或,不赋值)
由此看来,对于两个长度相等的bitset是去运算是很EZ的
STL用法
[ ]:
s[k] :表示s的第k位,即可取值也可赋值,编号从0开始;
count:
s.count() 返回二进制串中有多少个1;
any/none
若s所有位都为0,则s.any()返回false,s.none()返回true;
若s至少有一位为1,则s.any()返回true,s.none()返回false;
set/rest/flip
s.set()把s所有位变为1;
s.set(k,v)把s的第k位改为v,即s[k]=v;
s.reset()把s的所有位变为0.
s.reset(k)把s的第k位改为0,即s[k]=0;
s.flip()把s所有位取反.即s=~s;
s.flip(k)把s的第k位取反
了解完了,那就上错题重解吧
题目详情:#515. 「LibreOJ β Round #2」贪心只能过样例 - 题目 - LibreOJ (loj.ac)
其实可以看做是01pack
上代码吧:
#include <bits/stdc++.h>
using namespace std;
bitset<1000005>f[2];//为2就行了,相当于辗转,数滚动了一下
int main(){
ios::sync_with_stdio(false);
int n;
cin >> n;
f[0][0]=1;//不打就相当于是空的
for(int i=1;i<=n;i++){
int l,r ;
cin >> l >> r;
for(int j=l;j<=r;j++){
f[i%2]|=f[(i-1)%2]<<(j*j);//|相当于将原来的1加到这个位置上(有1就是1)
//记录新一轮可能有的所有情况,每种情况占1
}
f[(i-1)%2].reset();
}
cout<<f[n%2].count(); //此时记录完了,当然肯定是每个数都有所选择
}

浙公网安备 33010602011771号