题意:给你50000个五维点(a1,a2,a3,a4,a5),50000个询问(q1,q2,q3,q4,q5),问已知点里有多少个点(x1,x2,x3,x4,x5)满足(xi<=qi,i=1,2,3,4,5),强制在线。

一看题的一个直接思路是五维树状数组,算了一下复杂度还不如暴力判,遂不会做。赛后问了一下大神们,知道是分块+bitset,觉得处理挺巧妙的,就留一份题解在这里。

具体的做法是这样子的。定义一个bitset<maxn> bs[i][k],表示第i维前k块所对应的点的bitset,之所以要分块是因为不分块的话空间开不下。所以现在每一个询问过来,其实就是对每一维求出所有比它小的bitset,这些bitset & 起来的结果的count就是要求的答案。

我觉得这里比较玄妙的点是分块bitset,用分块去避开空间不够的影响在很多优化的问题上都是挺有帮助的。

#pragma warning(disable:4996)
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#include <list>
#include<time.h>
#include<bitset>
using namespace std; #define maxn 50005 struct Node
{
int val, id;
Node(int _val, int _id) :val(_val), id(_id){}
Node(){}
bool operator < (const Node &b)const{
if (val == b.val) return id < b.id;
return val < b.val;
}
}a[6][maxn];
int n,m,q; bitset<maxn> bs[5][250];
int block_num;
int per_block; int main()
{
int T; cin >> T;
while (T--)
{
cin >> n >> m;
for (int i = 0; i < n; ++i){
for (int j = 0; j < 5; ++j){
scanf("%d", &a[j][i].val);
a[j][i].id = i;
}
}
for (int i = 0; i < 5; ++i) sort(a[i], a[i] + n);
block_num = sqrt(n + .0);
per_block = ceil(n / (block_num + .0)); for (int i = 0; i < 5; ++i){
for (int k = 0; k < block_num; ++k){
bs[i][k].reset();
}
} for (int i = 0; i < 5; ++i){
for (int j = 0; j < n; ++j){
bs[i][j / per_block].set(a[i][j].id);
}
} for (int i = 0; i < 5; ++i){
for (int j = 0; j < block_num; ++j){
if (j) bs[i][j] |= bs[i][j - 1];
}
} cin >> q;
int ans = 0;
bitset<maxn> res, tmp;
int d;
while (q--)
{
res.set();
for (int k = 0; k < 5; ++k){
tmp.reset();
scanf("%d", &d);
d ^= ans;
int index = upper_bound(a[k], a[k] + n, Node(d, n + 1)) - a[k] - 1;
if (index < 0){
res.reset();
continue;
}
if (index / per_block) {
tmp = bs[k][index / per_block - 1];
}
int start = (index / per_block)*per_block;
int end = index;
for (int i = start; i <= end; ++i){
tmp.set(a[k][i].id);
}
res &= tmp;
}
ans = res.count();
printf("%d\n", ans);
}
}
return 0;
}

  

hihocoder1236(2015长春网赛J题) Scores(bitset && 分块)的更多相关文章

  1. ACM学习历程—HDU 5443 The Water Problem(RMQ)(2015长春网赛1007题)

    Problem Description In Land waterless, water is a very limited resource. People always fight for the ...

  2. ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

    Problem Description On the way to the next secret treasure hiding place, the mathematician discovere ...

  3. hdu 5443 (2015长春网赛G题 求区间最值)

    求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 2 ...

  4. hdu 5446(2015长春网络赛J题 Lucas定理+中国剩余定理)

    题意:M=p1*p2*...pk:求C(n,m)%M,pi小于10^5,n,m,M都是小于10^18. pi为质数 M不一定是质数 所以只能用Lucas定理求k次 C(n,m)%Pi最后会得到一个同余 ...

  5. hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题

    题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给 ...

  6. hdu 5455 (2015沈阳网赛 简单题) Fang Fang

    题目;http://acm.hdu.edu.cn/showproblem.php?pid=5455 题意就是找出所给字符串有多少个满足题目所给条件的子串,重复的也算,坑点是如果有c,f以外的字符也是不 ...

  7. hdu 5441 Travel (2015长春网赛)

    http://acm.hdu.edu.cn/showproblem.php?pid=5441 题目大意是给一个n个城市(点)m条路线(边)的双向的路线图,每条路线有时间值(带权图),然后q个询问,每个 ...

  8. hdu 5441 (2015长春网络赛E题 带权并查集 )

    n个结点,m条边,权值是 从u到v所花的时间 ,每次询问会给一个时间,权值比 询问值小的边就可以走 从u到v 和从v到u算不同的两次 输出有多少种不同的走法(大概是这个意思吧)先把边的权值 从小到大排 ...

  9. hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)

    平面上有m个点,要从这m个点当中找出n个点,使得包含这n个点的圆的半径(圆心为n个点当中的某一点且半径为整数)最小,同时保证圆周上没有点. n > m 时要输出-1 样例输入43 2 0 0 1 ...

随机推荐

  1. 3,Linux入门

    操作系统的分类 Windows系列操作系统,Unix类操作系统,Linux类操作系统,Mac操作系统 提问:为什么要去学习Linux? 同学甲可能要问,超哥你介绍了这么多有关Linux的知识,但我还是 ...

  2. Maven项目Update Project自动恢复为JRE1.5的问题

    问题: 使用Eclipse建立Maven项目的时候,JDK默认为1.5在用户使用Config Build Path更新为最新JRE库比如1.8或者1.7的后,Maven项目显示JRE1.8 or 1. ...

  3. Java线程---简介

    实现方式 在java中线程有两种实现方式: 1.继承thread类 2.实现runnable接口 Thread类 Thread类时在java.lang包中定义的,继承thread类必须重写run()方 ...

  4. HEXO next live2d插件删除问题

    title: HEXO next live2d插件删除问题 date: 2018-03-06 13:09:12 updated: tags: [hexo,next,建站,学习,前端技术,疑问] des ...

  5. Tomcat详解及SNS系统的部署实现

    Tomcat详解及SNS系统的部署实现   http://jungege.blog.51cto.com/4102814/1409290

  6. Eclipse Java 构建路径 ---Eclipse教程第13课

    Eclipse Java 构建路径 设置 Java 构建路径 Java构建路径用于在编译Java项目时找到依赖的类,包括以下几项: 源码包 项目相关的 jar 包及类文件 项目引用的的类库 我们可以通 ...

  7. CTF python沙箱逃逸进阶题目

    future引用了python3的新特性,所以是不能直接回回显,得用print file函数可以读取. print(().__class__.__bases__[0].__subclasses__() ...

  8. NGUI-使用UILabel呈现图片和不同格式的文字

    1.可以使用BBCode标记 [b]Bold[/b]                      粗体[i]italic[/i]                         斜体[u]underli ...

  9. 孤荷凌寒自学python第二十六天python的time模块的相关方法

    孤荷凌寒自学python第二十六天python的time模块的相关方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 要使用time模块的相关方法,必须在文件顶端引用: import tim ...

  10. css深入理解relative

    第一讲     relative和absolute相煎关系 同源性 .position:relative .position:absolute 限制作用 1.限制left/top/right/bott ...