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. linux打印彩色字

    echo显示带颜色,需要使用参数-e格式如下:echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"例如: echo -e "\033[41;37m T ...

  2. java使用*导包的性能

    项目中切换到IDEA工具,使用Git提交代码之后在comments中被吐槽了.事情是这样的原有的导入包被IDEA优化了,譬如java.util.Set, java.util.Map, ... 会被优化 ...

  3. centos 手动增加swap分区

    SWAP是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的.它类似于Windows中的虚拟内存.在Windows中,只可以使用文件来当作虚拟内存.而linux可以文件或者分区来当作 ...

  4. Lua内存分析工具

    最近给公司写了一个lua内存分析工具,可以非常方便的分析出Lua内存泄露问题,有图形化界面操作,方便手机端上传快照等功能 内存分析我是在c语言端写的,也有人写过lua端的分析工具,也蛮好用的,不过lu ...

  5. POJ 1018 Communication System(贪心)

    Description We have received an order from Pizoor Communications Inc. for a special communication sy ...

  6. Servlet中文乱码问题解决办法

    首先对于源jsp网站和servlet里面的字符集要一样,一般支持中文的字符集为UTF-8最好采用这个字符集(除此之外还有gb2312); 对于源jsp文件的代码中需要设置 设置你的page里面的字符集 ...

  7. windows与虚拟机linux能ping通设置

    作为以后参考所用. 首先,介绍如何在VMWare中设置linux的网络.一般网络选项有Bridged,NAT,host-only几种,本次以host-only作详细说明,如下图: 在选择host-on ...

  8. 浅谈 Glide - BitmapPool 的存储时机 & 解答 ViewTarget 在同一View显示不同的图片时,总用同一个 Bitmap 引用的原因

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  9. Navicat远程连接阿里云服务器的mysql

    问题描述: 本机为win10,mysql安装在阿里云(Ubuntu系统)上,本机使用Navicat远程连接mysql,遇到一些坑,求助于阿里云,最终解决,特此记录一下! 安装mysql sudo ap ...

  10. 经典案例之MouseJack

    引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...