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. 2n皇后问题

    此题为蓝桥杯基础练习题. 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后 ...

  2. Sublime Text3 快捷键汇总及设置快捷键配置环境变量

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...

  3. POJ 1021 2D-Nim

    Description The 2D-Nim board game is played on a grid, with pieces on the grid points. On each move, ...

  4. Java基础(含思维导图)

    很早之前整理的Java基础的一些知识点,思维导图: 1.'别名现象' 对一个对象赋值另一个对象,会指向新的对象引用,赋值前的对象引用会由于不再被引用而被gc回收: 而基本类型则不同.基本类型存储了实际 ...

  5. golang 实现简单的一致性哈希

    package main import ( "fmt" "sort" "hash/crc32" ) var serverMap map[ui ...

  6. 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:黄文俊,腾讯云高级产品经理,曾经历过企业级存储.企业级容器平台等产品的架构与开发,对容器.微服务.无服务器.DevOps等都有浓厚兴趣. ...

  7. web自动化一(selenium+python+pycharm环境搭建)

    年前公司刚刚搭起了web自动化测试框架的环境,趁着过完年还没全部忘掉,准备把如何搭建环境的方法和大家分享下,有哪里不对的地方,请批评指正,共同进步,共勉! 为此我把搭建环境所需的软件打包上传到百度云, ...

  8. [记录]Zabbix3.4配置监控Oracle12c的存活状态和表空间使用率

    Zabbix3.4配置监控Oracle的存活状态和表空间使用率 1.安装zabbix3.4 agent: # rpm -ivh http://repo.zabbix.com/zabbix/3.4/rh ...

  9. 基于netty框架的Socket传输

    一.Netty框架介绍 什么是netty?先看下百度百科的解释:         Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开 ...

  10. Duilib第一步(II)-Hello World

    My first Duilib program 1. Prepare for development 打开DuiFarm项目DuiFarm.cpp文件,将除_tWinMain函数之外所有内容删除.删除 ...