hihocoder1236(2015长春网赛J题) Scores(bitset && 分块)
题意:给你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 && 分块)的更多相关文章
- 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 ...
- ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)
Problem Description On the way to the next secret treasure hiding place, the mathematician discovere ...
- hdu 5443 (2015长春网赛G题 求区间最值)
求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 2 ...
- 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最后会得到一个同余 ...
- hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题
题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给 ...
- hdu 5455 (2015沈阳网赛 简单题) Fang Fang
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5455 题意就是找出所给字符串有多少个满足题目所给条件的子串,重复的也算,坑点是如果有c,f以外的字符也是不 ...
- hdu 5441 Travel (2015长春网赛)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题目大意是给一个n个城市(点)m条路线(边)的双向的路线图,每条路线有时间值(带权图),然后q个询问,每个 ...
- hdu 5441 (2015长春网络赛E题 带权并查集 )
n个结点,m条边,权值是 从u到v所花的时间 ,每次询问会给一个时间,权值比 询问值小的边就可以走 从u到v 和从v到u算不同的两次 输出有多少种不同的走法(大概是这个意思吧)先把边的权值 从小到大排 ...
- hiho 1227 找到一个恰好包含n个点的圆 (2015北京网赛 A题)
平面上有m个点,要从这m个点当中找出n个点,使得包含这n个点的圆的半径(圆心为n个点当中的某一点且半径为整数)最小,同时保证圆周上没有点. n > m 时要输出-1 样例输入43 2 0 0 1 ...
随机推荐
- AD15添加导入组件
- poj3348 Cows 凸包 叉积求多边形面积
graham扫描法,参考yyb #include <algorithm> #include <iostream> #include <cstdio> #includ ...
- Android FrameWork 概述
Framework是什么 Framework的中文意思是“框架”,在软件开发中通常指开发框架,在一个系统中处于内核层之上,为顶层应用提供接口,被设计用来帮助开发者快速开发顶层应用,而不必关心系统内核运 ...
- SSTI注入绕过(沙盒逃逸原理一样)
在python沙盒逃逸中绕过道理是一样的. 1.python沙盒中删除了很多模块,但是没有删除reload reload(__builtins__),重新加载被删除的模块,直接命令执行,只用于py2 ...
- HTML5新增属性学习笔记
1.form属性 表单内的从属元素,可以写在表单外部.可以通过指定元素的form属性来声明元素所属表单.form的属性值为表单的id. <form id="testForm" ...
- centos6 install cobbler
cobbler 安装 一:定义yum源 wget -c -O CentOS-Base.repo http://mirrors.163.com/.help/CentOS6-Base-163.repo ...
- [g2o]C++图优化库
g2o以图模型表达上述最小二乘问题:比较适合解决SLAM问题 http://openslam.org http://wiki.ros.org/g2o
- C#共享内存
百度:C#共享内存. 文章:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 资料:UnmanagedMemoryAccessor 资料:MemoryMappe ...
- 主流 NoSQL 数据库对比
HBase HBase 是 Apache Hadoop 中的一个子项目,属于 bigtable 的开源版本,所实现的语言为Java(故依赖 Java SDK).HBase 依托于 Hadoop 的 H ...
- BZOJ3244 [Noi2013]树的计数 【数学期望 + 树遍历】
题目链接 BZOJ3244 题解 不会做orz 我们要挖掘出\(bfs\)序和\(dfs\)序的性质 ①容易知道\(bfs\)序一定是一层一层的,如果我们能确定在\(bfs\)序中各层的断点,就能确定 ...