【HIHOCODER 1513】 小Hi的烦恼 (BitSet)
描述
小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)的更多相关文章
- hihocoder#1513 : 小Hi的烦恼 bitset
目录 题目链接 题解 代码 题目链接 hihocoder#1513 : 小Hi的烦恼 题解 cdq 套cdq 套cdq 套cdq就完了呀 对每一科开n个bitset 表示该科目前i个有谁 每次查询都& ...
- hihocoder 1513 小Hi的烦恼——bitset
题目:http://hihocoder.com/problemset/problem/1513 自带的题解写得很好…… #include<cstdio> #include<cstri ...
- hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...
- hihocoder 1513 小Hi的烦恼 (bitset优化)
大意: n个人, 5门课, 给定每个人每门课的排名, 对于每个人输出有多少人5门课都比他差. 明显是个5维偏序问题, 题目有保证排名均不同, 可以用bitset优化为$O(\frac{n^2}{\om ...
- hihoCoder 1513 小Hi的烦恼
hihoCoder 1513 小Hi的烦恼 思路: 用bitset判断交集个数 代码: #include<bits/stdc++.h> using namespace std; #defi ...
- HihoCoder#1513 : 小Hi的烦恼(五维数点 bitset 分块)
题意 题目链接 Sol 五位数点问题,写个cdq分治套cdq分治套cdq分治套cdq分析就完了 可以用bitset搞 对于每一科开\(n\)个bitset,其中\(b[i]\)表示的排名为\(1 - ...
- hihoCoder 1513 : 小Hi的烦恼 位运算好题
思路:考虑第i个同学,第一门课排名比他靠前的同学的集合是S1,第二门课是S2...第五门课是S5,很明显比这个同学每门课程都优秀的同学就是S1&S2&S3&S4&S5, ...
- hiho#1513 : 小Hi的烦恼 五维偏序
hiho#1513 : 小Hi的烦恼 五维偏序 链接 hiho 思路 高维偏序用bitset,复杂度\((\frac{n^2}{32})\) 代码 #include <bits/stdc++.h ...
- 【hihoCoder】#1513 : 小Hi的烦恼
题解 我会五维数点辣 只要用个bitset乱搞就好了 记录一下rk[i][j]表示第j科排名为i的是谁 用30000 * 5个大小为30000的bitset s[i][j]是一个bitset表示第j科 ...
- HiHoCoder1513:小Hi的烦恼——题解
https://hihocoder.com/problemset/problem/1513 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在高中期间参加了市 ...
随机推荐
- Kruskal 2015百度之星初赛2 HDOJ 5253 连接的管道
题目传送门 /* 最小生成树(Kruskal):以权值为头,带入两个端点,自然的排序;感觉结构体的并查集很好看 注意:题目老头要的是两个农田的高度差,中文水平不好,题意理解成和平均值的高度差! */ ...
- 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)
Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...
- 利用uiautomator实现Android移动app启动时间的测试
为了减少因手工测试的反应误差,这里介绍下如何利用Android自带的自动化测试工具uiautomator实现app启动时间的测试. 测试基本思路如下: 1.启动前记录当前的时间戳 2.启动app,直至 ...
- C. Jon Snow and his Favourite Number DP + 注意数值大小
http://codeforces.com/contest/768/problem/C 这题的数值大小只有1000,那么可以联想到,用数值做数组的下标,就是类似于计数排序那样子.. 这样就可以枚举k次 ...
- MonoBehaviour生命周期
MonoBehaviour生命周期 上图中重要的信息点很多,需要特别注意的是所有脚本的Awake方法都执行完才会执行Start,但是如果在Awake 中开启了一个协程这个协程中每一帧执行一些操作然后等 ...
- AJPFX总结I/O流操作(一)
在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下I/O,数据库操作 一:从数据流开始 首先先有一个结构图看一下整 ...
- poj1724 ROADS
题意: N个城市,编号1到N.城市间有R条单向道路.每条道路连接两个城市,有长度和过路费两个属性.Bob只有K块钱,他想从城市1走到城市N.问最短共需要走多长的路.如果到不了N,输出-12<=N ...
- Eclipse项目转Android Studio
刚来某公司的时候,发现Android开发仍然还在使用Eclipse,编码无规范,渠道打包竟然手动,svn版本主干分支管理混乱,总之各种low... 对于有强迫症的我来说,属实不可忍.但无奈,新人一个, ...
- ZooKeeper读书笔记
<ZooKeeper读书笔记> 1.Zookeeper是什么?Zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用可以基于它实现诸如数据发布/订阅.负载均衡.命名服务.分布 ...
- 51nod 1417 天堂里的游戏
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 多年后,每当Noder看到吉普赛人,就会想起那个遥远的下午. Noder躺在草地上漫无目的的张望,二 ...