bitset(01串)优化
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 ;
}
例题:
正解并非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串)优化的更多相关文章
- 牛客 197E 01串
大意: 给定01串, 单点修改, 询问给定区间$[l,r]$, 假设$[l,r]$从左往右得到的二进制数为$x$, 每次操作增加或减少2的幂, 求最少操作数使得$x$为0. 线段树维护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尽可能多,任意 ...
- wannafly25 E 01串
链接 wannafly25 E 01串 给出一个\(01\)串,有两种操作,操作一是将某一个位置的数字修改,操作二是询问某一个区间,将这个区间看做\(1\)个二进制数,可以随意加减\(2\)的幂次,问 ...
- 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- ...
- 洛谷P2727 01串 Stringsobits
P2727 01串 Stringsobits 24通过 55提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 这题的思路是啥啊!!!跪求- 题目背景 考虑 ...
- C++实现01串排序
题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...
- 01串(dp)
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...
- 【巧妙】【3-21个人赛】Problem C 01串
Problem C Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Sub ...
- NYOJ-252 01串
01串 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描写叙述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这样的长 ...
随机推荐
- P1273 有线电视网(树形dp)
P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. ...
- How to manage local libraries in IntelliJ IDEA
如何在 IntelliJ IDEA 中管理本地类库 一般来说,如果项目是基于 Maven 管理工具的,我们会在 pom.xml 中添加 dependency 来管理依赖.但有时也会遇到要用的类库不在 ...
- Vue 父子组件传递方式
问题: parent.vue <template> <div> 父组件 <child :childObject="asyncObject">&l ...
- easyui实现多选框,并且获取值
在easyui官方文档里面是没有combobox下拉框,可以进行多选的,但是其实是可以多选的, <td align="left">大区: <input typ ...
- 查看linux上面是否有安装redis
- [Re:从零开始的分布式] 0.x——Reids实现分布式锁
上节提到了,分布式锁通常应满足如下要求,互斥性.高可用.高效率.可重入.锁失效这五个基本原则.由于Redis自身“快”的特点,所以高效率可以看作满足. 下文在单机情况下与多机情况下,对利用Redis实 ...
- Mac 10.12常用软件清单
链接: https://pan.baidu.com/s/1slds1OD 密码: 7m5t 配套教程:http://www.cnblogs.com/EasonJim/tag/mac/ 如果失效了,联系 ...
- (热死你)Resin https ssl Linux 配置,实战可用
(热死你)Resin https ssl Linux 配置,实战可用 一.配置resin 1.在resin服务器中创建目录keys文件和openssl.conf,格式内容如下: #先复制以下的内容: ...
- [Xamarin] 開啟另外一個Activity 並且帶資料 (转帖)
每隻App是透過許多畫面所組成的,當然可能主畫面之外,都會有許多其他的頁面 再Android 設計中畫面會有配合的Activity 當然在這之前,最好事先了解一下,Android 關於生命週期的規劃 ...
- HDOJ 5019 Revenge of GCD
Revenge of GCD In mathematics, the greatest common divisor (gcd), also known as the greatest common ...