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(); //此时记录完了,当然肯定是每个数都有所选择 
}

ac证明:提交记录 #1750016 - LibreOJ (loj.ac)

posted @ 2023-04-10 16:51  铃狐sama  阅读(71)  评论(0)    收藏  举报