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. 推荐 11 个好用的 JS 动画库

    为了保证的可读性,本文采用意译而非直译. 1.Three.js 超过46K的星星,这个流行的库提供了非常多的3D显示功能,以一种直观的方式使用 WebGL.这个库提供了<canvas>. ...

  2. DenseASPP论文总结

    论文地址:http://openaccess.thecvf.com/content_cvpr_2018/papers/Yang_DenseASPP_for_Semantic_CVPR_2018_pap ...

  3. Out of range value for column 'field_length'

    往mysql数据库中插入数据是报错: Out of range value for column 'field_length' 字段类型是tinyint(4) 一开始以为是长度太小造成的,改成tiny ...

  4. Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解

    Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解 题目地址:https://codingcompetitions.withgoogle.com/kickstar ...

  5. hive分区与实际分区文件不匹配导致spark读文件出错的问题解决

    先解释下,由于历史原因导致hive中的看到分区比hdfs中的文件夹不匹配,存在hive中分区数有,实际hdfs中无此文件夹. spark中通过sparkSQL读取hive中的该表时,将会出现异常. 解 ...

  6. windows mysql 修改配置datadir后 重启报错1067

    修改datadir目录 #datadir=C:/ProgramData/MySQL/MySQL Server 5.6/Data datadir=F:/ProgramData/MySQL/MySQL S ...

  7. PHP MQTT 实践

    MQTT介绍:http://mqtt.org 服务器端https://mosquitto.org/download/ PHP客户端https://github.com/bluerhinos/phpMQ ...

  8. 关于linux新建用户并赋予文件夹权限和scp权限的问题

    当前用户是aaa,新建用户bbb: $adduser bbb 赋予sudo权限(即把用户bbb添加到sudo组):$usermod -a -G sudo bbb 切换到bbb:$su - bbb 假设 ...

  9. 深入解读阿里云Redis开发规范

    Key命名设计:可读性.可管理性.简介性 规范建议使用冒号即:进行分割拼接,因为很多Redis客户端是根据冒号分类的.比如有几个Key:apps:app:1.apps:app:2和apps:app:3 ...

  10. python时间戳,获取当前时间,时间格式转换,求出前几天或后几天的时间

    import time import datetime import locale import random class TimeUtil: def __init__(self, curtime=N ...