c++ stl bitset

c++ bitset 是个比较有用的东西

说的高深点这是:

C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。

bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。

说的简单一点,这是:

一个可以用位运算的数组,也用于32位的压缩。

是不是简单易懂,

他的一般定义:

#include<bitset>
bitset<2000000>f;

就可以使用f:

f[i]=a; f=f<<a; 如此

接下来附两道:



1302: 装箱问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 278  解决: 185
[提交][状态][讨论版]

题目描述

有一个箱子容量为v(正整数,0<=v<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入

箱子的容量v
物品数n
接下来n行,分别表示这n个物品的体积

输出

箱子剩余空间

样例输入

24
6
8
3
12
7
9
7

样例输出

0

提示

 

来源

 

[提交][状态][讨论版]

这是一道水到不能再水的水题,先附普通版,
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<vector>
 8 using namespace std;
 9 typedef long long ll;
10 typedef long double ld;
11 typedef pair<int,int> pr;
12 const double pi=acos(-1);
13 #define rep(i,a,n) for(int i=a;i<=n;i++)
14 #define per(i,n,a) for(int i=n;i>=a;i--)
15 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
16 #define clr(a) memset(a,0,sizeof(a))
17 #define pb push_back
18 #define mp make_pair
19 #define fi first
20 #define sc second
21 #define pq priority_queue
22 #define pqb priority_queue <int, vector<int>, less<int> >
23 #define pqs priority_queue <int, vector<int>, greater<int> >
24 #define vec vector
25 ld eps=1e-9;
26 ll pp=1000000007;
27 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
28 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
29 //void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
30 int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
31 ll read(){ ll ans=0; char last=' ',ch=getchar();
32 while(ch<'0' || ch>'9')last=ch,ch=getchar();
33 while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
34 if(last=='-')ans=-ans; return ans;
35 }
36 //头文件
37 
38 
39 
40 
41 int f[20000]; 
42 int main()
43 {
44     int v=read(),n=read(); f[0]=1;
45     rep(i,1,n) {
46         int a=read();
47         per(x,v,a)
48           f[x]=f[x]|f[x-a];
49     }
50     per(i,v,0)
51       if (f[i]) {
52         cout<<v-i; break;
53     }
54 } 
View Code

 

 
再来bitset:
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define LL long long
 7 #define rep(i,a,b) for (int i=a;i<=b;i++)
 8 #define per(i,a,b) for (int i=a;i>=b;i--)
 9 #define inf 1<<29
10 #define clr(i,c) memset(i,c,sizeof(i))
11 using namespace std;
12 inline int read(){
13     int x=0,f=1; char ch=getchar();
14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
16     return x*f; 
17 }
18 #include<bitset>
19 bitset<20000>f;
20 int main()
21 { 
22   f[0]=1;
23   int v=read();
24   int n=read();
25   while (n--){
26       int x=read();
27       f=f|(f<<x);
28   }
29   per(i,v,0)
30     if (f[i]){
31         printf("%d\n",v-i);
32         return 0;
33     } 
34 }
View Code

 

又来一题:

2096: bitset习题

时间限制: 1 Sec  内存限制: 128 MB
提交: 29  解决: 21
[提交][状态][讨论版]

题目描述

小呆开始研究集合论了,他提出了关于一个数集四个问题:
1. 子集的异或和的算术和。
2. 子集的异或和的异或和。
3. 子集的算术和的算术和。
4. 子集的算术和的异或和。
目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把
这个问题交给你,未来的集训队队员来实现。

 

输入

第一行,一个整数 n。
第二行,n 个正整数,表示 a1, a2, …, an

 

输出

一行,包含一个整数,表示所有子集和的异或和。

 

样例输入

21 3

样例输出

6【样例解释】6 = 1 ⊗ 3 ⊗ (1 + 3)【数据规模与约定】数据分为 A,B,C 三类。A 类数据 (20%) 保证:ai > 0,1 ≤ n ≤ 10。B 类数据 (40%) 保证:ai > 0,1 ≤ n ≤ 1000,∑ ai ≤ 10000。C 类数据 (40%) 保证:ai > 0,1 ≤ n ≤ 1000,∑ ai ≤ 2000000。另外,不保证集合中的数满足互异性,即有可能出现 ai = aj 且 i ̸= j。

提示

 

来源

 
[提交][状态][讨论版]
上代码:
 

 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define LL long long
 7 #define rep(i,a,b) for (int i=a;i<=b;i++)
 8 #define per(i,a,b) for (int i=a;i>=b;i--)
 9 #define inf 1<<29
10 #define clr(i,c) memset(i,c,sizeof(i))
11 using namespace std;
12 inline int read(){
13     int x=0,f=1; char ch=getchar();
14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
16     return x*f; 
17 }
18 #include<bitset>
19 bitset<2000000>f;
20 int ans;
21 int main()
22 { 
23   f[0]=1;
24   int n=read();
25   while (n--){
26       int x=read();
27       f=f^(f<<x);
28   }
29   rep(i,1,2000000)
30     if (f[i]) ans^=i;
31   cout<<ans<<endl; 
32 }
View Code

 



一堆函数:

 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流

 

posted @ 2016-09-11 22:11  SXia  阅读(194)  评论(0编辑  收藏  举报