bitset的经典使用:

见代码及注释:

#include<bitset>
#include<algorithm>
using namespace std;
//只需调用<bitset>库,以及声明namespace std #include<iostream>
#include<cstdio>
//作输出用 int main(){
bool flag;
int num,pos;
string mak_bit; //测试起: //声明部分: bitset<>b0[];
//可以声明数组 bitset<> b1;
//声明一个9(常数)个二进制位的bitset变量,为全0 num=;
bitset<> b2(num);
//声明一个9(常数)个二进制位的bitset变量,为num的二进制,多余顶部截断 mak_bit="";
bitset<>b3(mak_bit);
//声明一个9(常数)个二进制位的bitset变量,为mak_bit,不足前补零,多余自尾部截断,此处不能用char数组,且mak_bit只能是01 num=;
bitset<>b4(mak_bit,num);
//截取mak_bit第num位之后的字符串,按声明b3的方式声明 num=;pos=;
bitset<>b5(mak_bit,num,pos);
//截取mak_bit3第num为之后的pos位字符,按声明b3的方式声明 //应用部分: cin>>b1;cout<<b1<<" ";
//读入:读入一个字符串,从第一个非01的地方截断不足前补零,若读入长度为0,则不覆盖之前结果,否则覆盖,多余自尾部截断,输出:一个01串 b1=b2;b1=num;b1=;b1=5l;b1=5ll;
//(bitset)与(bitset(预定位数相等)) (int) (long long) (long)间重载了= b1<<=;b2=b1>>;b1|=b2;b1&=b2;b1^=b2;cout<<b1<<" "<<b2<<" ";
//bitset重载了位运算符,然而bitset并未重载其他运算符及布尔符(不能替代高精度) num=b2.count();printf("\n%d\n",num);
//统计有几位为1; flag=b1.none();printf("%s\n",flag?"YES":"NO");
//若b1为全0,返回true,否则返回false flag=b2.any();printf("%s\n",flag?"YES":"NO");
//若b1有位为1,返回true,否则返回false pos=;
num=b2[pos];printf("%d\n",num);
//返回第pos位,排列方式等价于返回它>>pos后,再&1 pos=;
flag=b2.test();printf("%s\n",flag?"YES":"NO");
//返回第pos位的bool类型 pos=;
b1.set(pos);b1.set();
//把第pos位变为1;把全体变为1 pos=;
b1.reset(pos);b1.set();
//把第pos位变为0,把全体变为0 pos=;
b1.flip(pos);b1.flip();
//把第pos位取反,把全体取反 return ;
}

例题:

[HNOI2005]数三角形

正解并非bitset优化O($n^3$)递推,然而,这样能过;

效率$O({{n^3} \over {64}})$

n=1000显然可以过;

因为洛谷数据1挂了,所以加了特判n==4;

bzoj的话,好像需要把数组之类的开大点?

题解

(我会说暴力递推比正解难写?)

代码:

 #include<cstdio>
#include<bitset>
using namespace std;
bitset<>br[];
bitset<>bd[];
bool f_dl[],f_rl[];
short f_rw[],f_dw[],f_lw[];
int n;
int main()
{
int i,j,k,l;
int already;
long long ans=;
scanf("%d",&n);
if(n==)return ;
//据说第一个点挂了
for(i=;i<=n;i++){
already=(i-)*i/;
for(j=;j<=i;j++)
for(k=;k<=;k++){
scanf("%d",&l);
if(k==)
f_rl[already+j-]=l,f_lw[already+j]=l;
if(k==)
f_dw[already+j]=l;
if(k==){
f_dl[already+j]=l;
if(i!=n)f_rw[already+j+i]=l;
}
}
}
for(i=;i<=n;i++){
already=(i-)*i/;
f_rl[already+i]=f_rw[already+i]=false;
}
for(i=n;i>=;i--){
already=(i-)*i/;
for(j=i;j>=;j--){
if(j!=i&&i!=n){
br[already+j]=br[already+j+]&br[j++already+i];
if(f_rl[already+j])
br[already+j].set(n--j);
bd[already+j]=bd[j+already+i]&bd[j++already+i];
if(f_dl[already+j])
bd[already+j].set(n-i);
if(f_rw[already+j])
f_rw[already+j]+=f_rw[already+j+];
if(f_lw[already+j])
f_lw[already+j]+=f_lw[already+j+i];
if(f_dw[already+j])
f_dw[already+j]+=f_dw[already+j+i+];
}
if(j==n&&i==n){
if(f_dl[already+j])
bd[already+j].set(n-i);
continue;
}
if(j==i){
bd[already+j]=bd[j+already+i]&bd[j++already+i];
if(f_dl[already+j])
bd[already+j].set(n-i);
if(f_lw[already+j])
f_lw[already+j]+=f_lw[already+j+i];
if(f_dw[already+j])
f_dw[already+j]+=f_dw[already+j+i+];
}
if(i==n){
if(f_rl[already+j])
br[already+j].set(n-j-);
if(f_dl[already+j])
bd[already+j].set(n-i);
}
}
}
for(i=;i<=n;i++){
already=(i-)*i/;
for(j=;j<=i;j++){
br[already+j]>>=((n-j)-min(f_dw[already+j],f_rw[already+j]));
bd[already+j]>>=((n-i+)-min(f_dw[already+j],f_lw[already+j]));
k=br[already+j].count();
ans+=(long long )k;
k=bd[already+j].count();
ans+=(long long )k;
}
}
printf("%lld\n",ans);
return ;
}

SB暴力

bitset(01串)优化的更多相关文章

  1. 牛客 197E 01串

    大意: 给定01串, 单点修改, 询问给定区间$[l,r]$, 假设$[l,r]$从左往右得到的二进制数为$x$, 每次操作增加或减少2的幂, 求最少操作数使得$x$为0. 线段树维护2*2矩阵表示低 ...

  2. 01串LIS(固定串思维)--Kirk and a Binary String (hard version)---Codeforces Round #581 (Div. 2)

    题意:https://codeforc.es/problemset/problem/1204/D2 给你一个01串,如:0111001100111011101000,让你改这个串(使0尽可能多,任意 ...

  3. wannafly25 E 01串

    链接 wannafly25 E 01串 给出一个\(01\)串,有两种操作,操作一是将某一个位置的数字修改,操作二是询问某一个区间,将这个区间看做\(1\)个二进制数,可以随意加减\(2\)的幂次,问 ...

  4. JZOJ P1847:找01串

    传送门 DP预处理+贪心 首先设$f[i][j]$表示长度为$i$的01串中有不大于$j$个1,然后显然 $f[i][j]=\sum_{k=1} ^{j} C[i][k]$ $C[i][j]=C[i- ...

  5. 洛谷P2727 01串 Stringsobits

    P2727 01串 Stringsobits 24通过 55提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 这题的思路是啥啊!!!跪求- 题目背景 考虑 ...

  6. C++实现01串排序

    题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...

  7. 01串(dp)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...

  8. 【巧妙】【3-21个人赛】Problem C 01串

    Problem C Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

  9. NYOJ-252 01串

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这样的长 ...

随机推荐

  1. Google 里的软件工程学

    简评:原文作者 Fergus Henderson 在 Google 工作了 10 年以上,目前负责 Google 的 text-tospeech 工程小组.有很多书籍或文章会从 商业/管理 等非技术角 ...

  2. python基础知识梳理----5dict 字典的应用

    内容简介: 1:字典简介 2:字典的增删该查 3:字典嵌套 1: 字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是唯一的. 在保存的时候, 根 ...

  3. Java多线程——线程封闭

    线程封闭:当访问共享的可变数据时,通常需要同步.一种避免同步的方式就是不共享数据.如果仅在单线程内访问数据,就不需要同步,这种技术称为线程封闭(thread  confinement) 线程封闭技术一 ...

  4. Java NIO学习与记录(三): Scatter&Gather介绍及使用

     Scatter&Gather介绍及使用 上一篇知道了Buffer的工作机制,以及FileChannel的简单用法,这一篇介绍下 Scatter&Gather 1.Scatter(分散 ...

  5. 洛谷 P3757 [CQOI2017]老C的键盘

    题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...

  6. Go语言容器

    Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值. Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它.不过,Map 是无 ...

  7. C# 聊一聊屏保的设置

    初步认识屏保 进入屏保设置 强行开头,大家都知道我们只需要在搜索框打入“屏保”,就能进入屏保的设置选项.然而箭头指向的位置到底是在Windows的哪个地方呢?这就是写这篇博客的原因. 进入一个屏幕保护 ...

  8. js img转换base64

    方法一:canvas <script type="text/javascript"> function getBase64Image(img) { var canvas ...

  9. Compile git version inside go binary

    Compile git version inside go binary Abstract 在我们编写的程序中总是希望可以直接查阅程序的版本,通过--version参数就会输出如下版本信息. Buil ...

  10. Mono for Android - LocationServices not working

    Hi,I have the following code in my location activity.(this code was copied from Xamarin's Location S ...