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. P1273 有线电视网(树形dp)

    P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. ...

  2. How to manage local libraries in IntelliJ IDEA

    如何在 IntelliJ IDEA 中管理本地类库 一般来说,如果项目是基于 Maven 管理工具的,我们会在 pom.xml 中添加 dependency 来管理依赖.但有时也会遇到要用的类库不在 ...

  3. Vue 父子组件传递方式

    问题: parent.vue <template> <div> 父组件 <child :childObject="asyncObject">&l ...

  4. easyui实现多选框,并且获取值

    在easyui官方文档里面是没有combobox下拉框,可以进行多选的,但是其实是可以多选的, <td align="left">大区:   <input typ ...

  5. 查看linux上面是否有安装redis

  6. [Re:从零开始的分布式] 0.x——Reids实现分布式锁

    上节提到了,分布式锁通常应满足如下要求,互斥性.高可用.高效率.可重入.锁失效这五个基本原则.由于Redis自身“快”的特点,所以高效率可以看作满足. 下文在单机情况下与多机情况下,对利用Redis实 ...

  7. Mac 10.12常用软件清单

    链接: https://pan.baidu.com/s/1slds1OD 密码: 7m5t 配套教程:http://www.cnblogs.com/EasonJim/tag/mac/ 如果失效了,联系 ...

  8. (热死你)Resin https ssl Linux 配置,实战可用

    (热死你)Resin https ssl Linux 配置,实战可用 一.配置resin 1.在resin服务器中创建目录keys文件和openssl.conf,格式内容如下: #先复制以下的内容: ...

  9. [Xamarin] 開啟另外一個Activity 並且帶資料 (转帖)

    每隻App是透過許多畫面所組成的,當然可能主畫面之外,都會有許多其他的頁面 再Android 設計中畫面會有配合的Activity 當然在這之前,最好事先了解一下,Android 關於生命週期的規劃 ...

  10. HDOJ 5019 Revenge of GCD

    Revenge of GCD In mathematics, the greatest common divisor (gcd), also known as the greatest common ...