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. [golang][gui]Hands On GUI Application Development in Go【在Go中动手进行GUI应用程序开发】读书笔记03-拒交“智商税”,解密“GUI”运行之道

    和老外的原文好像没多大联系了,哈哈哈,反正是读书笔记,下面的内容也是我读此书中的历程,也写进来吧.不过说实话,这框架的作者还挺对我脾气的,哈哈哈. 拒交“智商税”,解密“GUI”运行之道 我很忙 项目 ...

  2. SIT系统整合测试

    System Integrate Test的缩写,即系统整合测试      系统整合测试就是评估产品在其规格范围内的环境下工作,能否完成产品设计规格所需要的功能及与周边设备.应用软件的兼容性.大致可以 ...

  3. mac 搭建Java Spring boot 环境(idea)

    首先安装插件 安装下面的这个插件 然后重启idea,新建工程 选择新建 Springboot 框架 改写项目名称 选择类型 设置工程名称 删除多余的文件 编译工程 然后运行 1. 2. 参考: htt ...

  4. mark一下咕掉的题目

    蒟蒻才普及组呀~ 大佬别D我 等集中补一下 CF980F:咋说捏,我觉得要联赛了做这题有点浪费时间,等想颓废了再来写写叭qwq 215E/279D/288E/331C3/431D/433E/750G/ ...

  5. 自己动手实现DNS协议

    1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...

  6. DELPHI开始支持LINUX DOCKER

    DELPHI开始支持LINUX DOCKER 本方翻译自Marco Cantu的文章. 在过去的几年中,将服务器端解决方案(实际上是任何类型的应用程序)部署到轻量级容器而不是物理机器或虚拟机已经变得越 ...

  7. ubuntu下Vim安装失败

    sudo apt-get install vim Reading package lists... Done Building dependency tree Reading state inform ...

  8. java join()基本用法与说明解释

    join()方法的作用,是等待这个线程结束: 也就是说,t.join()方法阻塞调用此方法的线程(calling thread)进入 TIMED_WAITING 状态,直到线程t完成,此线程再继续: ...

  9. 946. Validate Stack Sequences

    946. Validate Stack Sequences class Solution { public: bool validateStackSequences(vector<int> ...

  10. WebGL学习笔记(十一):混合和透明

    到目前为止我们绘制了不少模型,用到了不少颜色,颜色中有四个分量(RGBA),其中的A分量表示透明度,这个分量目前为止我们还没有真正的用到: A分量,表示的是当前的透明度,如果设定为 0.5 就会半透明 ...