描述


小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好。

小Hi在高中期间参加了市里的期末考试,一共五门:语文、数学、英语、物理、化学。

成绩出来之后,小Hi发现有些同学,所有科目都考的比他好,他很烦恼。所以他想知道所有科目都比自己名次靠前的同学的人数。

为了方便,可以认为不存在两个人某一门名次是相同的。

其他同学们也想知道有多少人全面碾压了他们,所以你需要对所有人输出答案。

解题方法提示

输入


第一行,一个正整数N(N <= 30000),表示人数。

接下来N行,每行五个整数,分别表示五门课依次的排名。

输出


输出共N行,每行一个整数,表示答案。

样例输入

4
1 1 2 2 1
2 3 3 3 2
3 2 1 1 3
4 4 4 4 4

样例输出

0
1
0
3

题解


BitSet就是一个大二进制串,同时实现了二进制数的各种位运算,我们利用任意位上的值为0或1来标志集合中是否存在这个数,可以有效的节约空间,同时也方便了各种集合运算。

BitSet内部实现以每32位转化为32位整型,然后32位的运算变为一次位运算,这样可以把整体\(O(n)\)的集合运算转化为\(O(n/32)\)

链接:BitSet常用方法

排名肯定是连续的,对于每一科排名,从前到后累计一下之前是那些人,最后在对第i个人每一科排名之前的人集合求一个交集。

Java版

import java.io.*;
import java.util.*; public class Main {
static final int N=30005;
static final int inf=0x3f3f3f3f;
static BitSet vis[][]=new BitSet[N][5];
static BitSet a[]=new BitSet[N];
static int id[][]=new int[N][5];
static int x[][]=new int[N][5];
public static void main(String[] args) {
InputStream sys=System.in;
InputReader in=new InputReader(sys);
PrintWriter out=new PrintWriter(System.out);
int n=in.nextInt();
for(int i=0;i<n;i++) {
for(int j=0;j<5;j++) {
x[i][j]=in.nextInt();
id[x[i][j]][j]=i;
vis[i][j]=new BitSet();
}
a[i]=new BitSet();
a[i].set(i,true);
}
for(int j=0;j<5;j++) {
vis[n][j]=new BitSet();
}
for(int i=1;i<=n;i++) {
for(int j=0;j<5;j++) {
vis[i][j]=(BitSet) vis[i-1][j].clone();
if(i<n) vis[i][j].set(id[i][j],true);
}
}
BitSet ans=new BitSet();
for(int i=0;i<n;i++) {
ans=(BitSet) vis[x[i][0]][0].clone();
for(int j=1;j<5;j++) {
ans.and(vis[x[i][j]][j]);
}
ans.andNot(a[i]);
out.println(ans.cardinality());
}
out.flush();
}
static class InputReader {
public BufferedReader reader;
public StringTokenizer tokenizer; public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream), 32768);
tokenizer = null;
} public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
} public int nextInt() {
return Integer.parseInt(next());
} public long nextLong() {
return Long.parseLong(next());
} public double nextDouble() {
return Double.parseDouble(next());
}
}
}

C++版

#include <bitset>
#include <queue>
#include <cmath>
#include <cstdio>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define inf 1000000000
#define PI acos(-1)
#define REP(i,x,n) for(int i=x;i<=n;i++)
#define DEP(i,n,x) for(int i=n;i>=x;i--)
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void Out(ll a){
if(a<0) putchar('-'),a=-a;
if(a>=10) Out(a/10);
putchar(a%10+'0');
}
const int N=30005;
int x[N][5],id[N][5];
bitset<N> vis[N][5],a[N];
bitset<N> ans;
int main(){
int n=read();
for(int i=0;i<n;i++) {
for(int j=0;j<5;j++) {
x[i][j]=read();
id[x[i][j]][j]=i;
}
a[i].set();
a[i][i]=false;
}
for(int i=1;i<=n;i++) {
for(int j=0;j<5;j++) {
vis[i][j]=vis[i-1][j];
if(i<n) vis[i][j].set(id[i][j],true);
}
}
for(int i=0;i<n;i++) {
ans=vis[x[i][0]][0];
for(int j=1;j<5;j++) {
ans&=vis[x[i][j]][j];
}
ans&=a[i];
Out(ans.count());
puts("");
}
return 0;
}

【HIHOCODER 1513】 小Hi的烦恼 (BitSet)的更多相关文章

  1. hihocoder#1513 : 小Hi的烦恼 bitset

    目录 题目链接 题解 代码 题目链接 hihocoder#1513 : 小Hi的烦恼 题解 cdq 套cdq 套cdq 套cdq就完了呀 对每一科开n个bitset 表示该科目前i个有谁 每次查询都& ...

  2. hihocoder 1513 小Hi的烦恼——bitset

    题目:http://hihocoder.com/problemset/problem/1513 自带的题解写得很好…… #include<cstdio> #include<cstri ...

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

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

  4. hihocoder 1513 小Hi的烦恼 (bitset优化)

    大意: n个人, 5门课, 给定每个人每门课的排名, 对于每个人输出有多少人5门课都比他差. 明显是个5维偏序问题, 题目有保证排名均不同, 可以用bitset优化为$O(\frac{n^2}{\om ...

  5. hihoCoder 1513 小Hi的烦恼

    hihoCoder 1513 小Hi的烦恼 思路: 用bitset判断交集个数 代码: #include<bits/stdc++.h> using namespace std; #defi ...

  6. HihoCoder#1513 : 小Hi的烦恼(五维数点 bitset 分块)

    题意 题目链接 Sol 五位数点问题,写个cdq分治套cdq分治套cdq分治套cdq分析就完了 可以用bitset搞 对于每一科开\(n\)个bitset,其中\(b[i]\)表示的排名为\(1 - ...

  7. hihoCoder 1513 : 小Hi的烦恼 位运算好题

    思路:考虑第i个同学,第一门课排名比他靠前的同学的集合是S1,第二门课是S2...第五门课是S5,很明显比这个同学每门课程都优秀的同学就是S1&S2&S3&S4&S5, ...

  8. hiho#1513 : 小Hi的烦恼 五维偏序

    hiho#1513 : 小Hi的烦恼 五维偏序 链接 hiho 思路 高维偏序用bitset,复杂度\((\frac{n^2}{32})\) 代码 #include <bits/stdc++.h ...

  9. 【hihoCoder】#1513 : 小Hi的烦恼

    题解 我会五维数点辣 只要用个bitset乱搞就好了 记录一下rk[i][j]表示第j科排名为i的是谁 用30000 * 5个大小为30000的bitset s[i][j]是一个bitset表示第j科 ...

  10. HiHoCoder1513:小Hi的烦恼——题解

    https://hihocoder.com/problemset/problem/1513 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在高中期间参加了市 ...

随机推荐

  1. 多个版本数据库在在一台数据库上lib 的切换问题。

    lib 的切换问题. 现象: /home/dbmon  >sqlplus / as sysdba/usr/lib/hpux64/dld.so: Unsatisfied data symbol ' ...

  2. memcached随笔练习

    实验环境: RHEL 6.5 (已关闭selinux,iptables) 首先部署LNMP环境,该步骤采用源码编译安装 安装Nginx-1.8.0 准备软件包:nginx-1.8.0.tar.gz 下 ...

  3. Ionic之页面传值

    很多时候,我们都进入一个页面往往都是需要将上一级的数据转入到下一级页面中使用,在传传统的html中时经过url来传值,所以ionic也是沿用了html中的方法. 但是还是有点区别于html.我们直接在 ...

  4. AJPFX关于java的依赖 关联 聚合的关系解释

    依赖:  两个相对独立的系统,当一个系统要构筑另一个系统的实例,或者依赖另一的服务时,这两个就是依赖关系.比如自行车和打气筒之间就是依赖关系.代码表现形式如下:    public class A{  ...

  5. dubbo系列--重要概念介绍

    dubbo架构图 节点角色说明 整体设计 proxyFactory:就是为了获取一个接口的代理类,例如获取一个远程接口的代理.它有2个方法,代表2个作用 getInvoker:针对server端,将服 ...

  6. Java GC机制简要总结(Java垃圾回收的基本工作原理)

    第一次编辑 2019-05-07 01:09:39 垃圾回收的对象 程序中的不可用对象(不存活的对象,没有任何引用),或者无用的变量信息等,在程序中长期存在会逐渐占用较多的内存空间,导致没有足够的空间 ...

  7. grunt配置详情

    这个grunt配置 是我的一个程序员朋友从网上无意间看到的,然后他亲测了下,恩,是可以的.不过我到目前还未测试过是否可以. 一.安装node, 首先确保电脑已有node的环境.然后 运行  npm i ...

  8. poj1857 To Europe! To Europe!

    思路: 一维dp. 实现: #include <cstdio> #include <iostream> using namespace std; const int INF = ...

  9. chrome调试之Workspaces

    可通过workspaces来编辑本地文件 workspaces是Chrome DevTools的一个强大功能,这使DevTools变成了一个真正的IDE.Workspaces会将Sources选项卡中 ...

  10. Linux 使用常见问题

    1. 如何查看软件安装到什么位置 [Ubuntu] 今天安装了Lxc-docker,想看一下文件都安装到哪里了,首先找到这个包的ersion zhouh1@uhome:~$ dpkg -s lxc-d ...