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个物品的体积
输出
箱子剩余空间
样例输入
样例输出
提示
来源
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 }
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 }
2096: bitset习题
时间限制: 1 Sec 内存限制: 128 MB提交: 29 解决: 21
[提交][状态][讨论版]
题目描述
小呆开始研究集合论了,他提出了关于一个数集四个问题:
1. 子集的异或和的算术和。
2. 子集的异或和的异或和。
3. 子集的算术和的算术和。
4. 子集的算术和的异或和。
目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把
这个问题交给你,未来的集训队队员来实现。
输入
第一行,一个整数 n。
第二行,n 个正整数,表示 a1, a2, …, an
输出
一行,包含一个整数,表示所有子集和的异或和。
样例输入
样例输出
提示
来源
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 }
一堆函数:
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流 |