Bitset简介

下面介绍C++ STL 中一个非常有用的东西:

Bitset

类似于二进制状压,它可以把信息转化成一个01串存储起来

定义方法:

首先要#include<bitset>或#include<bits/stdc++.h>

然后定义一个长度为len的bitset S

bitset<len>S;

一些操作

bitset还支持&,^,|三个运算

b._Find_first() 找到第一个1的位置

b._Find_next(x)找到x后面为1的第一个位置

复杂度

时间:我感觉很慢,但学长说是O(玄学),而且开了氧气优化后跑的飞快

空间:自己测一下就好


[HZOI 2015]偏序++

题面戳我

这是一道有趣的k+1维偏序,加上下标最多有7维

树套树套树套......套树?显然写不出

几层CDQ套在一起?O(n log^k n),TLE飞了

kd-tree可以卡过

这道题可以考虑用bitset做

对于每一个k+1维的组合,如果求出每一维小于它的集合,答案就是每一维的交集,就是二进制按位与

用bitset可以做到

可以这样bitset <40000> S[8][40000]

然后就AC了

???等等,你当bitset不要空间的吗?显然不行

所以我们考虑分块,只记录下每块块顶的,快内的暴力算,时间O(\(n\sqrt n\))

可以吊打kd-tree

代码

# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
# define Copy(a, b) memcpy(a, b, sizeof(a))
# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
using namespace std;
typedef long long ll;
const int _(5e4 + 10); IL ll Read(){
RG char c = getchar(); RG ll x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int n, bl[_], pre[_], suf[_], blo, k, b[8][_], bblo;
pair <int, int> a[8][_];
bitset <_> S[8][250]; IL int Find(RG int v, RG int x){
RG int l = 1, r = n, ans = 0;
while(l <= r){
RG int mid = (l + r) >> 1;
if(a[x][mid].first <= v) l = mid + 1, ans = mid;
else r = mid - 1;
}
return ans;
} IL bitset <_> Getbst(RG int x, RG int y){
bitset <_> ans; ans.reset();
RG int pos = Find(y, x);
if(!pos) return ans;
ans = S[x][bl[pos] - 1];
for(RG int i = pre[pos]; i <= pos; ++i) ans.set(a[x][i].second);
return ans;
} IL ll Calc(){
bitset <_> ans; RG ll ret = 0;
for(RG int i = 1; i <= n; ++i){
ans.set();
for(RG int j = 1; j <= k; ++j) ans &= Getbst(j, b[j][i]);
ret += ans.count() - 1;
}
return ret;
} int main(RG int argc, RG char* argv[]){
File("partial_order_plus");
n = Read(); k = Read() + 1; bblo = sqrt(n);
for(RG int i = 1; i <= n; ++i) a[1][i] = make_pair(b[1][i] = i, i);
for(RG int j = 2; j <= k; ++j)
for(RG int i = 1; i <= n; ++i)
a[j][i] = make_pair(b[j][i] = Read(), i);
for(RG int i = 1; i <= n; ++i){
bl[i] = (i - 1) / bblo + 1;
pre[i] = (bl[i] - 1) * bblo + 1;
suf[i] = min(n, bl[i] * bblo);
}
blo = bl[n];
for(RG int i = 2; i <= k; ++i) sort(a[i] + 1, a[i] + n + 1);
for(RG int j = 1; j <= k; ++j)
for(RG int i = 1; i <= blo; ++i){
S[j][i] = S[j][i - 1]; RG int d = (i - 1) * bblo + 1;
for(RG int l = pre[d]; l <= suf[d]; ++l) S[j][i].set(a[j][l].second);
}
printf("%lld\n", Calc());
return 0;
}

Bitset([HZOI 2015]偏序++)的更多相关文章

  1. COGS 2580. [HZOI 2015]偏序 II

    COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...

  2. BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]

    2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...

  3. 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合

    [题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...

  4. [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树

    [cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...

  5. cogs 2123. [HZOI 2015] Glass Beads

    2123. [HZOI 2015] Glass Beads ★★★   输入文件:MinRepresentations.in   输出文件:MinRepresentations.out   简单对比时 ...

  6. cogs 2320. [HZOI 2015]聪聪的世界题解

    2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...

  7. 【CJOJ2375】 【HZOI 2015】偏序 II(cdq分治,树状数组)

    传送门 CJOJ Solution 具体实现参考上一篇Blog(四维偏序) 代码实现1(cdq+cdq+cdq+BIT) /* mail: mleautomaton@foxmail.com autho ...

  8. hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)

    题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...

  9. 数据结构(分块):[HZOI 2015]easy seq

    [题目描述] 给定一个序列,下标从0开始,分别为a0,a1,a2...an−1,有m个询问,每次给出l和r,求满足ai=aj且l<=i<=j<=r时j−i的最大值 本题强制在线,l和 ...

随机推荐

  1. js内存泄露的原因

    1.意外的全局变量 function fun(){ a=19//全局变量 console.log(a) } 2.未及时清理计时器或者回调函数 //记得及时清理定时器 var intervalId=se ...

  2. GCD实现倒计时

    之前面试中,好多面试官,问使用GCD如何实现倒计时,我当时也没写过,所以一时不知道怎么说,所以结束之后,我实现一下GCD的倒计时. - (void)startTime:(UIButton *)send ...

  3. android 如何画心

    先前写了一个Windows版的画心,现在想把windows版的画心变成安卓版的. xml布局: <?xml version="1.0" encoding="utf- ...

  4. css y轴溢出滚动条,x轴溢出显示

    这个是我工作中遇到的一个问题,困扰了我好几天,彻底理解了什么叫思路很重要. 黄色盒子里的内容是要超出出现滚动条的,红色的方块是根据另外的元素去定位的,于是呢 我就加上了 overflow-y:auto ...

  5. python file文件操作--内置对象open

    说明: 1. 函数功能打开一个文件,返回一个文件读写对象,然后可以对文件进行相应读写操作. 2. file参数表示的需要打开文件的相对路径(当前工作目录)或者一个绝对路径,当传入路径不存在此文件会报错 ...

  6. react按需加载(getComponent优美写法),并指定输出模块名称解决缓存(getComponent与chunkFilename)

    react配合webpack进行按需加载的方法很简单,Route的component改为getComponent,组件用require.ensure的方式获取,并在webpack中配置chunkFil ...

  7. ubuntu16.04卸载软件

    root@test:/# dpkg -l | grep cobbler root@test:/# sudo dpkg --purge cobbler

  8. 迁移学习︱艺术风格转化:Artistic style-transfer+ubuntu14.0+caffe(only CPU)

    说起来这门技术大多是秀的成分高于实际,但是呢,其也可以作为图像增强的工具,看到一些比赛拿他作训练集扩充,还是一个比较好的思路.如何在caffe上面实现简单的风格转化呢? 好像网上的博文都没有说清楚,而 ...

  9. 基于am3358的lcd输出

    /*#include<stdio.h> */ #include <unistd.h> #include <stdio.h> #include <stdlib. ...

  10. Caused by: java.lang.ClassNotFoundException: ognl.PropertyAccessor

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...