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. 第08组 Alpha冲刺(2/6)

    队名:955 组长博客: 作业博客:https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/9939 组员情况 组员1(组长):庄锡荣 过去 ...

  2. unity:坐标变换 - 两个函数

    在cocos中,我们知道有如下的坐标变换函数: CCPoint convertToNodeSpace(const CCPoint& worldPoint);CCPoint convertToW ...

  3. Mac版最详细的Flutter开发环境搭建

    上周任务不多,闲来无事想学习一下flutter耍一耍,发现flutter的环境搭建步骤还是很繁琐的,官网的搭建教程只是按步骤让你进行操作,中间出现的问题完全没有提及,对我这种没搞过原生开发的小白来说超 ...

  4. RSA算法java实现(BigInteger类的各种应用)

    一.RSA算法 1.密钥生成 随机生成两个大素数p.q 计算n=p*q 计算n的欧拉函数f=(p-1)*(q-1) 选取1<e<f,使e与f互素 计算d,ed=1modf 公钥为(e,n) ...

  5. template cannot be keyed. Place the key on real elements instead.

    template cannot be keyed. Place the key on real elements instead. 一.总结 一句话总结: 原因:vue不支持在 template 元素 ...

  6. 哈希表查找(散列表查找) c++实现HashMap

    算法思想: 哈希表 什么是哈希表 在前面讨论的各种结构(线性表.树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较.这一类 ...

  7. mestasploit笔记 :MS17-010

    实验环境 操作机 :Kali 2017 操作机IP:172.16.11.2 目标机:Windows 7 目标机IP:172.16.12.2 实验目的 认知Windows远程溢出漏洞的危害 知悉MS17 ...

  8. vue项目 既能通过ip访问项目,又可以本地localhost访问

    1.场景问题: 有时候开发过程中,vue项目需要其他同事能访问你本地进行调试,而不是需要重新拉取代码来启动很麻烦 2.解决思路: 一. package.json"dev": &qu ...

  9. odoo开发笔记 -- 当前时间&时间运算相关

    当前日期/时间: from datetime import datetime, timedelta now_time = datetime.now() today_date_format = now_ ...

  10. thinkphp项目部署在phpstudy里的nginx上

    朋友的一个thinkphp做的项目,让我帮他部署一下的,LINUX服务器,用宝塔. 第一台服务器,装上宝塔,宝塔里装NGINX,PHP5.6,再建立网站,绑定域名,访问成功,一切正常! 昨天试着给另一 ...