胡小兔的OI博客C++ bitset 常用函数及运算符

对于一个叫做foo的bitset:

  foo.size() 返回大小(位数)
  foo.count() 返回1的个数
  foo.any() 返回是否有1
  foo.none() 返回是否没有1
  foo.set() 全都变成1
  foo.set(p) 将第p + 1位变成1
  foo.set(p, x) 将第p + 1位变成x
  foo.reset() 全都变成0
  foo.reset(p) 将第p + 1位变成0
  foo.flip() 全都取反
  foo.flip(p) 将第p + 1位取反
  foo.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
  foo.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
  foo.to_string() 返回它转换为string的结果

hihocoder1513

  题目大意:求对于每个人来说,5门功课的名次都比他靠前的人数。

  由提示中,我们就知道需要用bitset用解这题,(否则的话五维偏序得CDQ分治和数据结构套来套去)。主要思路就是如果我们知道单独每个科目名次靠前的集合,那么就是求5个集合的交集,但这个求交集上如果是用暴力的方法很明显会超时,这时候就需要运用到bitset了,其实c++/Java中的一种数据结构类似于数组,但可以直接对其做位运算。这样我们知道每个人的每门功课排第几,那么我们也可以知道每门功课排第几是谁。这样的话,bitset比当前名次靠前的人,如100100,就表示这么功课比当前名次靠前的有第0个人,和第3个人(我习惯从0开始),类似状压的思想。

 #include<cstdio>
#include<bitset>
using namespace std;
const int N=;
int a[N][],b[][N];
//a[i][j]第i个人第j门功课排第几, b[i][j]第i功课排第j的是谁
bitset<N> c[][N],ans;//c[i][j]第i门功课排第j的人,名次比他高的有谁
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=;i<n;i++)
for(int j=;j<;j++)
{
scanf("%d",&a[i][j]);
a[i][j]--;//因为我是从0开始的,所以这里--
b[j][a[i][j]]=i;
c[j][i].reset();
}
for(int i=;i<;i++)
for(int j=;j<n;j++)
{
c[i][j]=c[i][j-];
c[i][j].set(b[i][j-]);
}
for(int i=;i<n;i++)
{
ans=c[][a[i][]];
for(int j=;j<;j++)
ans&=c[j][a[i][j]];
printf("%d\n",ans.count());
}
}
return ;
}

二进制tql

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

STL中的BITSET运用的更多相关文章

  1. 【整理】STL中的bitset(二进制华丽解决假五维偏序题)

    ------------更多Bitset的运用,请看这里http://www.cnblogs.com/hua-dong/p/8519739.html. 由于在学cdq分治,看到了这道题.先来看一道题目 ...

  2. [C++]STL中的容器

    C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...

  3. STL中的容器

    STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist ...

  4. STL中的二分查找——lower_bound 、upper_bound 、binary_search

    STL中的二分查找函数 1.lower_bound函数 在一个非递减序列的前闭后开区间[first,last)中.进行二分查找查找某一元素val.函数lower_bound()返回大于或等于val的第 ...

  5. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  6. STL中的next_permutation

    给定一个数组a[N],求下一个数组. 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 ..... 在STL中就有这个函数: 1.参数是(数组的第一个元素,数组的末尾),注意这是前闭后开 ...

  7. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

  8. C++的模板特化 和 STL中iterator_traits模板的偏特化

    C++中有类模板和函数模板,它们的定义如下所示: 类模板: template<class T1,class T2> class C { //... }; 函数模板: template< ...

  9. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

随机推荐

  1. mysql数据库的 varchar 和 char 的区别

    char是存储字符(无论字母还是汉字都最多存255个) char(20)表示这个字段最多存20个字符 如果存了16个字符    那么也会占用20个字符的空间 varchar是存储字节(1个字母1个字节 ...

  2. python如何切割字符串

    python字符串的分割方法如下 str.split():字符串分割函数 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. 语法: str.split(s, num)[n] 参数说明: s: ...

  3. selenium登录慕课网

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.s ...

  4. 让 history 命令显示日期和时间

    echo 'HISTTIMEFORMAT="%F %T "' >> /etc/profile source /etc/profile

  5. 第十一章 ZYNQ-MIZ701 PS读写PL端BRAM

      本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将 ...

  6. 正则表达式 第五篇:C# 正则表达式

    原文:正则表达式 第五篇:C# 正则表达式 本文整理C#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符.普通字符是指字面含义不变 ...

  7. faceswap深度学习AI实现视频换脸详解

    给大家介绍最近超级火的黑科技应用deepfake,这是一个实现图片和视频换脸的app.前段时间神奇女侠加尔盖朵的脸被换到了爱情动作片上,233333.我们这里将会从github项目faceswap开始 ...

  8. multer使用

    使用multer 1.      在项目中下载multer操作模块 Npm install multer  --save 前端代码: <form class="layui-form&q ...

  9. 查看PHP指定扩展的版本信息

    命令:php --ri 扩展名

  10. UART串口简介

    通用异步收发传输器(Universal Asynchronous Receiver Transmitter) 原理 发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出 ...