------------更多Bitset的运用,请看这里http://www.cnblogs.com/hua-dong/p/8519739.html

由于在学cdq分治,看到了这道题。先来看一道题目

hihocoder1513):
  • 问题:给出每个人(n<=100000)的五门学科成绩,求出所有人:五门学科名次都比自己靠前的同学的人数
 
学过cdq分治的应该知道,这就是个五维偏序,只要一维排序,二维分治,然后树套树套树就能轻松搞定了。。。去他妈的

请拉到最下面,先感受一下代码。开始的确想过用集合,但是两秒放弃,因为无法用充分利用二进制,集合手动还得合并,而且得到集合的过程也得一一成绩对比,好像不可能完成。

oh,然后hihocoder介绍了强无敌的bitset,以前见过,但是没仔细看,因为那次只有60位,我好像用string解决的,没想到有这么强大(欠打)。

下面介绍以下bitset的基本使用信息,(大多是别人的东西,筛选后复制过来的),详细的还请移步百度文库:

和int long的比较 :

一般,int占4个字节,long占8个字节。而一个字节是由8个位组成的。 
粗略估计,int和BitSet的比例为4*8:1,即32:1(因为bitset只保存0或者1,一位就够了)。如果是long,差距就更大了。(所以你能想象开到上亿的数组感觉多么快乐吗。。。。)

和vector的比较:

类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:

bitset<32> bitvec;            //32位,全为0。

给出的长度值必须是常量表达式比如16,32,1313520,4008208820,etc。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。

这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。

bitset的初始化:

bitset<maxn> b;

b有maxn位,每位都为0

bitset<maxn> b(u);

b是unsigned long型u的一个副本

bitset<maxn> b(s);

b是string对象s中含有的位串的副本

bitset<maxn> b(s, pos, n);

b是s中从位置pos开始的n个位的副本

(string和int的方向有点差别,string是从右往左)

本题bitset的巧妙:

22,23行充分利用了相邻排名的关系,如果不用二进制,一一传递很费时。

26,28行充分利用了二进制的交集运算,如果不用二进制,也很麻烦。

 #include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int maxn=;
int Rank[maxn][],sa[maxn][],ans;
bitset<maxn+>Set[maxn][],tmp;
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=;i<=n;i++)
for(j=;j<=;j++){
scanf("%d",&sa[i][j]);
Rank[sa[i][j]][j]=i;
}
for(j=;j<=;j++)
for(i=;i<=n;i++){
Set[i][j]=Set[i-][j];
Set[i][j].set(Rank[i-][j]);
}
for(i=;i<=n;i++){
tmp=Set[sa[i][]][];
for(j=;j<=;j++)
tmp&=Set[sa[i][j]][j];
printf("%d\n",tmp.count());
}
return ;
}

【整理】STL中的bitset(二进制华丽解决假五维偏序题)的更多相关文章

  1. STL中的BITSET运用

    胡小兔的OI博客C++ bitset 常用函数及运算符 对于一个叫做foo的bitset: foo.size() 返回大小(位数) foo.count() 返回1的个数 foo.any() 返回是否有 ...

  2. HihoCoder - 1513 bitset处理五维偏序

    题意:给出\(n<3e4\)个有序组\((a,b,c,d,e)\),求对第\(i\)个有序组有多少个\(j\)满足\((a_j<a_i,b_j<b_i,c_j<c_i,d_j& ...

  3. 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...

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

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

  5. hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)

    链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...

  6. HihoCoder - 1236 Scores (五维偏序,分块+bitset)

    题目链接 题意:给定n个五维空间上的点,以及m组询问,每组询问给出一个点,求五个维度都不大于它的点有多少个,强制在线. 神仙题 单独考虑每个维度,把所有点按这个维度上的大小排序,然后分成T块,每块用一 ...

  7. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  8. 深入了解STL中set与hash_set,hash表基础

    一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...

  9. C++ STL中的常用容器浅谈

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...

随机推荐

  1. Linux常用命令大全(转载)

    最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...

  2. centos7修改网卡名、密码重置

    修改网卡名称 编辑 /etc/sysconfig/grub   倒数第二行quiet 后加入 net.ifnames=0  biosdevname=0 执行 grub2-mkconfig -o /bo ...

  3. Oracle性能优化之Oracle里的执行计划

    一.执行计划 执行计划是目标SQL在oracle数据库中具体的执行步骤,oracle用来执行目标SQL语句的具体执行步骤的组合被称为执行计划. 二.如何查看oracle数据库的执行计划 oracle数 ...

  4. RSA library

  5. Django - rest - framework - 下

    一.视图三部曲 https://www.cnblogs.com/wupeiqi/articles/7805382.html 使用混合(mixins) 之前得视图部分 # urls.py from dj ...

  6. Hotel---poj3667(线段树区间问题)

    题目链接:http://poj.org/problem?id=3667 题意:酒店有n个房间,现有m个团队,每个团队需要连续 d 个房间,现在有两个操作,1:需要 d 个房间,2:从 x 开始连续 d ...

  7. Can you solve this equation?---hdu2199(二分)

    http://acm.hdu.edu.cn/showproblem.php?pid=2199 给出y的值求x: 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 = Y x是0到100的 ...

  8. Python开发【杂货铺】:写code经常记不住的事儿

    1.添加系统环境变量: 每次写程序,把程序路径添加到环境变量中时,总是磕磕绊绊忘一些,搞得总是从之前的程序里直接copy # 程序目录添加到系统环境变量 import os import sys im ...

  9. Python性能分析指南(未完成)

    英文原文:http://www.huyng.com/posts/python-performance-analysis/ 译文:http://www.oschina.net/translate/pyt ...

  10. 【Jenkins学习 】解决jenkins运行磁盘满的问题

    一.背景 今天有同事编译Jenkins的相关Jobs的时候,出现了编译成功,但是输出产物失败的情况,如下图所示: Caused by:java.io.IOException: No space lef ...