Bitset常用操作:

bitset<size> s; //定义一个大小为size的bitset
s.count(); //统计s中1的个数
s.set(); //将s的所有位变成1
s.set(p); //将s的第p位变成1
s.reset(); //将s的所有位变成0
s.reset(p); //将s的第p位变成0
s.flip(); //将s的所有位取反
s.flip(p); //将s的第p位取反
s.to_string(); //将s转换成string

两个$bitset$运算的时间复杂度大概是$O(\frac{n}{32})$,所以能卡进去的话可以不写这个东西。

例题:

1.HDU5313-Bipartite Graph

有若干个二分图,现在你要添加一些边形成一个完全二分图,求最多可以添加多少边。

考虑对于每个二分图统计两部分的节点数$a_{i},b_i$,问题变为有两个集合,对于每个i,将$a_i$或$b_i$加入集合,使得两个集合的和尽量接近。

只需要模拟退火做一个背包,令$dp[i]$表示i是否能凑出来,最后取最接近$n/2$的能凑出来的数作为答案。用$bitset$优化该dp即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>
#define maxn 10005
#define maxm 500005
#define inf 0x7fffffff
#define ll long long using namespace std;
int N,M,hd[maxn],to[maxm],nxt[maxm],cnt;
int l[maxn],r[maxn],tot;
bool vis[maxn];
bitset<maxn> dp; inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} inline void addedge(int u,int v){to[++cnt]=v,nxt[cnt]=hd[u],hd[u]=cnt;} inline void dfs(int u,bool f){
vis[u]=;
if(!f) l[tot]++; else r[tot]++;
for(int i=hd[u];i;i=nxt[i]){
int v=to[i];
if(!vis[v]) dfs(v,(f^));
}
return;
} int main(){
int T=read();
while(T--){
N=read(),M=read();
tot=;cnt=;
memset(hd,,sizeof(hd));
memset(vis,,sizeof(vis));
memset(l,,sizeof(l));
memset(r,,sizeof(r));
for(int i=;i<=M;i++){
int u=read(),v=read();
addedge(u,v),addedge(v,u);
}
for(int i=;i<=N;i++) if(!vis[i]) tot++,dfs(i,);
dp.reset(); dp.set(,);
for(int i=;i<=tot;i++)
dp=(dp<<l[i])|(dp<<r[i]);
int ans=;
for(int i=;i<=N;i++)
if(dp[i]) ans=max(ans,i*(N-i)-M);
printf("%d\n",ans);
}
return ;
}

hdu5313

2.BZOJ2208-[Jsoi2010]连通数

给你一个有向图,求图中可达顶点对的个数。

考虑Floyd求最短路的过程是枚举中转点k后用k更新每对i,j,现在不需要求最短路而只需要判断能不能到达。

所以设$dp[k]$表示k能到达的点集的二进制表示,枚举k,i后用$dp[k]$更新$dp[i]$即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>
#define maxn 2005
#define maxm 500005
#define inf 0x7fffffff
#define ll long long using namespace std;
int N; char str[maxn][maxn];
bitset<maxn> dis[maxn]; inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} int main(){
N=read();
for(int i=;i<=N;i++){
scanf("%s",str[i]+);
for(int j=;j<=N;j++)
if(str[i][j]-''||i==j)
dis[i].set(j);
}
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
if(dis[i][k])
dis[i]|=dis[k];
int ans=;
for(int i=;i<=N;i++) ans+=dis[i].count();
printf("%d\n",ans);
return ;
}

bzoj2208

3.Hihocoder1236-Scores

在线求五维偏序的对数。

考虑可以对于每一维分别计算出满足要求的人的二进制表示后把5个二进制数与起来即为答案。

但这样空间时间两爆炸,所以考虑分块bitset,令$dp[k][i]$表示第k维前i个块的人的二进制表示。

对于每个询问的每一维二分查找出它所在的块,即可求出答案。

切忌在多重循环内使用两个$bitset$相互运算。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<bitset>
#include<cmath>
#define maxn 50005
#define maxm 305
#define inf 0x7fffffff
#define ll long long using namespace std;
bitset<maxn> dp[][maxm],tp,ans;
int N,M,bel[maxn],db[][maxn];
struct node{int val,ind;}h[][maxn]; inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} inline bool cmp(node a,node b){return a.val<b.val;}
inline int upb(int k,int x){
int l=,r=N,aans=;
while(l<=r){
int mid=l+r>>;
if(db[k][mid]<=x) l=mid+,aans=mid;
else r=mid-;
}
return aans;
} int main(){
//freopen("1.in","r",stdin);
//freopen("1.txt","w",stdout);
int T=read();
while(T--){
N=read(),M=read();
int len=sqrt(N);
memset(bel,,sizeof(bel));
memset(db,,sizeof(db));
for(int i=;i<=N;i++)
for(int j=;j<;j++)
h[j][i].val=read(),h[j][i].ind=i;
for(int i=;i<=N;i++) bel[i]=(i-)/len+;
for(int k=;k<;k++){
tp.reset(); sort(h[k]+,h[k]++N,cmp);
for(int i=;i<=N;i++) db[k][i]=h[k][i].val;
for(int i=;i<=N;i++){
tp.set(h[k][i].ind);
if(bel[i]!=bel[i+]) dp[k][bel[i]]=tp;
}
}
int Q=read(),lasans=;
for(int nu=;nu<=Q;nu++){
for(int k=;k<;k++){
int x=read()^lasans,pos=upb(k,x),id=bel[pos];
if(pos==) {ans.reset();continue;}
tp.reset(); if(id>=) tp|=dp[k][id-];
for(int i=(id-)*len+;i<=pos;i++) tp.set(h[k][i].ind);
if(k==) ans=tp; else ans&=tp;
}
lasans=ans.count();
printf("%d\n",lasans);
}
}
return ;
}

hihocoder1236

【模板】bitset的更多相关文章

  1. 穷竭搜索: POJ 2718 Smallest Difference

    题目:http://poj.org/problem?id=2718 题意: 就是输入N组数据,一组数据为,类似 [1  4  5  6  8  9]这样在0~9之间升序输入的数据,然后从这些数据中切一 ...

  2. 模板类-bitset

    stl提供了std::bitset模板类,定义:bitset <32> bitvec;尖括号中的为长度,这条语句把bitvec定义为含有32个的bitset对象.和容器一样,按位置来访问他 ...

  3. 高斯—若尔当(约当)消元法解异或方程组+bitset优化模板

    高斯消元法是将矩阵化为上三角矩阵 高斯—若尔当消元法是 选定主元后,将主元化为1,枚举除主元之外的所有行进行消元 即将矩阵化为对角矩阵,这样不用回代 bitset<N>a[N]; int ...

  4. 百度之星资格赛 调查问卷 bitset模板(直接将字符串转化成二进制数组并可以计算出十进制值)

    Problem Description 度度熊为了完成毕业论文,需要收集一些数据来支撑他的论据,于是设计了一份包含 mm 个问题的调查问卷,每个问题只有 'A' 和 'B' 两种选项. 将问卷散发出去 ...

  5. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

    题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...

  6. ACM模板(持续补完)

    1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

  7. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  8. C++ 标准库类型-String,Vector and Bitset

    <C++ Primer 4th>读书摘要 最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的字符串和集合.这些标准库类型是语言组成部分中更基本的那些数据类型(如 ...

  9. c++模板库(简介)

    目 录 STL 简介 ......................................................................................... ...

随机推荐

  1. node解析修改ngix配置文件

    主要是通过nginx-conf这个工具. git地址:https://github.com/tmont/nginx-conf 具体用法: npm install -S nginx-conf 安装工具 ...

  2. 在CentOS上使用Docker镜像安装Jenkins

    1.必须先在CentOS上安装Docker,使用以下命名先在Docker Hub上搜索Jenkins镜像 docker search jenkins 2.下载Jenkins镜像,命令如下:(我下载的是 ...

  3. NIOBuffer 缓冲区

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但是,Channel,Buffer 和 Select ...

  4. Mysql中联合索引的最左匹配原则(百度)

    创建联合索引时列的选择原则 经常用的列优先(最左匹配原则) 离散度高的列优先(离散度高原则) 宽度小的列优先(最少空间原则) 在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先.如果我们 ...

  5. 深度学习最全优化方法总结比较及在tensorflow实现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u010899985/article/d ...

  6. MySql删除重复数据并保留一条

    DELETE FROM tbl_1 WHERE id NOT IN( SELECT id FROM ( SELECT min(id) AS id FROM tbl_1 GROUP BY `duplic ...

  7. IIS 7中添加匿名访问FTP站点

    1. 开启FTP和IIS服务: 2.打开IIS 管理器: 我电脑上是IIS 7.5 ,所以选择第一个并点击打开哦. 如果你想知道自己IIS的版本,打开帮助菜单: 3. 新建FTP站点: 4. 填写站点 ...

  8. docker jenkins 插件安装提速

    公司安装的jenkins 自动布署服务挂了,好像有漏洞一直搞,打算重新安装一个,随便再学习一下 一上来就用docker 解决问题 #!/bin/bash docker stop myjenkins d ...

  9. 三句话看明白jdk收费吗

    对于从oracle下载的jdk8:JDK8u200(含)以下版本不收费. 对于从oracle下载的jdk11:JDK 11.0.0不收费,JDK 11.0.1不收费. 对于openjdk:免费 ——— ...

  10. Win10登陆界面卡住,进去后无法打开网络相关的设置,谷歌浏览器无法上网

    今天Win10抽风,进入登录页面输入用户名和密码之后,大约过了10分钟才进入桌面.重启后仍然如此. 经过调查,问题主要出在网络相关模块上,网络无法正常初始化,导致登录一直卡在网络初始化上. 解决方法如 ...