c++ bitset与位压缩
2015-07-27 13:54
543 查看
bitset是c++的一个类模板,声明方法为
表示一串长度为n的0或1的串
以下是它的一些成员函数的用法
最神奇的是它还可以使用位运算,这样可以用来优化一些dp的状态转移,即位压缩。
例如HDU5313
#inlcude <bitset> bitset<n>p; //此处的n必须为常数
表示一串长度为n的0或1的串
以下是它的一些成员函数的用法
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流 |
例如HDU5313
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <string> #include <map> #include <bitset> using namespace std; const int maxn = 20051; vector<int>G[10001]; int id[10001]; int col[maxn]; bool vis[10001]; bitset<10001>dp; struct node{ int a; int b; }tuan[10001]; void dfs(int u,int g){ id[u] = g; vis[u] = 1; for(int i = 0;i < G[u].size();i++){ int v = G[u][i]; if(!vis[v]){ dfs(v,g^1); } } } bool cmp(node a,node b){ return a.a-a.b>b.a-b.b; } int main() { int T,n,m; //freopen("1004.txt","r",stdin); cin>>T; while(T--){ int nn = 0; memset(id,0,sizeof(id)); memset(vis,0,sizeof(vis)); memset(col,0,sizeof(col)); scanf("%d%d",&n,&m); int u,v; for(int i = 0;i < m;i++){ scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } for(int i = 1;i <= n;i++){ if(!vis[i]){ dfs(i,nn); nn+=2; } } for(int i = 1;i <= n;i++){ col[id[i]]++; } int cnt = 0; for(int i = 0;i < nn;i += 2){ tuan[cnt].a = col[i]; tuan[cnt].b = col[i+1]; if(tuan[cnt].a < tuan[cnt].b) swap(tuan[cnt].a,tuan[cnt].b); cnt++; } int a; dp[tuan[0].a] = 1; dp[tuan[0].b] = 1; for(int i = 1;i < cnt;i++){ dp = (dp << tuan[i].a) | (dp << tuan[i].b);//状态转移 } int maxx = 100100,k = n/2; for(int i = 0;i < n;i++){ if(dp[i]){ if(maxx > abs(k-i)){ a = i; maxx = abs(k-i); } } } int ans = a*(n-a)-m; cout<<ans<<endl; for(int i = 0;i <= n;i++) {G[i].clear(); } dp.reset(); } return 0; }
相关文章推荐
- libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
- C++中避免内存泄露常见的解决方案
- c++获取系统d当前时间
- C++小品:井水不犯河水的thread_specific_ptr,C++11线程库中的本地存储
- c++调用python函数
- c++中explicit
- 用C++设计并实现一个大整数类
- 【C/C++学院】0724-堆栈简介/静态区/内存完成篇/多线程
- C++关于匿名空间
- C++输入输出流格式控制
- C++输入输出流格式控制 分类: C/C++ 2015-07-27 12:27 8人阅读 评论(0) 收藏
- C++中的随机数函数
- C++中的随机数函数 分类: C/C++ 2015-07-27 12:24 10人阅读 评论(0) 收藏
- C/C++编译的程序占用的内存分为几个部分:
- [LeetCode] Majority Element II
- 程序员笔试题--C++程序判读精选集
- C/C++ 开源 JSON 程序库性能及标准符合程度评测
- C++操作符重载
- C++11学习笔记(变量和基本类型)
- 读书笔记MoreEffectiveC++(16)