【整理】STL中的bitset(二进制华丽解决假五维偏序题)
------------更多Bitset的运用,请看这里http://www.cnblogs.com/hua-dong/p/8519739.html。
由于在学cdq分治,看到了这道题。先来看一道题目
- 问题:给出每个人(n<=100000)的五门学科成绩,求出所有人:五门学科名次都比自己靠前的同学的人数
请拉到最下面,先感受一下代码。开始的确想过用集合,但是两秒放弃,因为无法用充分利用二进制,集合手动还得合并,而且得到集合的过程也得一一成绩对比,好像不可能完成。
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(二进制华丽解决假五维偏序题)的更多相关文章
- STL中的BITSET运用
胡小兔的OI博客C++ bitset 常用函数及运算符 对于一个叫做foo的bitset: foo.size() 返回大小(位数) foo.count() 返回1的个数 foo.any() 返回是否有 ...
- 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& ...
- 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...
- hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...
- hihocoder #1236 Scores (15北京赛区网络赛J) (五维偏序,强制在线,bitset+分块)
链接:http://hihocoder.com/problemset/problem/1236 思路; 有n个五维的向量,给出q个询问,每个询问是一个五维向量,问有多少个向量没有一维比这个向量大.并且 ...
- HihoCoder - 1236 Scores (五维偏序,分块+bitset)
题目链接 题意:给定n个五维空间上的点,以及m组询问,每组询问给出一个点,求五个维度都不大于它的点有多少个,强制在线. 神仙题 单独考虑每个维度,把所有点按这个维度上的大小排序,然后分成T块,每块用一 ...
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- 深入了解STL中set与hash_set,hash表基础
一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...
- C++ STL中的常用容器浅谈
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...
随机推荐
- vue 引入通用 css
1.在入口 js 文件 main.js 中引入,一些公共的样式文件,可以在这里引入. import Vue from 'vue' import App from './App' // 引入App这个组 ...
- 删除 Linux /tmp 目录下的临时文件
使用 tmpreaper How to install and use tmpreaper How to Remove Files Older than N days using tmpreaper ...
- .NET获取Html字符串中指定标签的指定属性的值
using System.Text; using System.Text.RegularExpressions; //以上为要用到的命名空间 /// <summary> /// 获取Htm ...
- 麦子学院bootstrap实战项目官网,后台,jquery.singlePageNav.min.js ,wow.min.js,animate.css使用
1.源码笔记 我的源码+笔记(很重要):链接: https://pan.baidu.com/s/1eSxgLV0 密码: 2pi2 感谢麦子学院项目相关视频:链接: https://pan.baidu ...
- Java 中编程的格式
Java 编程注意的格式: 1.大括号对齐 2.遇到{ 缩进Tab 3.程序块之间加空行 4.并排之间加空格 5.运算符之间加空格 6.{ 之间加空格 7.成对编程 ({ }) 8.类名首字母大写 9 ...
- explain 分析 聚合统计语句的性能
EXPLAIN SELECT COUNT(1) FROM question; id select_type table partitions type possible_keys key key_le ...
- PHP对象在内存中的分配
对像在PHP 里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上 说大体上是分为4 段,栈空间段.堆空 ...
- android Dialog官方demo
1.普通的Dialog AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("今天 ...
- PAT 1110 Complete Binary Tree[判断完全二叉树]
1110 Complete Binary Tree(25 分) Given a tree, you are supposed to tell if it is a complete binary tr ...
- What do you think the coming adidas NMD Singapore
adidas NMD Singapore is surprising everybody with a lot of completely new NMD choices combined with ...