题目大意:

每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数

因为强行要求在线查询,所以题目要求,每次当前给定的学生成绩都异或上一次的答案

先将学生按每一门成绩都排一次序

这里将学生分块成sqrt(n)的块数,然后在当前块中用bitset容器来记录含有学生的状态

这里可以记录状态的前缀和,因为比后面成绩好的,必然比前面的学生的成绩也好

查询的时候只要查到正好比他高的学生属于哪一块,这样只要访问sqrt(n)次了

最后将5次得到的答案进行与操作就可以了

 #include<bits/stdc++.h>
using namespace std;
#define N 50001
#define pii pair<int,int>
int n , m , q , block;
bitset<N> bs[][]; //记录前缀或值和
pii val[][N]; void read()
{
scanf("%d%d" , &n , &m);
for(int i= ; i<n ; i++){
for(int j= ; j< ; j++){
scanf("%d" , &val[j][i].first);
val[j][i].second = i;
}
}
for(int i= ; i< ; i++) sort(val[i] , val[i]+n); block = (int)sqrt(n+0.5);
int i , j , k , index;
for(i= ; i< ; i++){
for(j= , index= ; j<n ; j+=block , index++){
int last = min(j+block,n);
bs[i][index].reset();
for(k=j ; k<last ; k++){
bs[i][index].set(val[i][k].second);
}
if(index) bs[i][index] |= bs[i][index-];
// cout<<i<<" "<<j<<" "<<bs[i][index].to_string()<<endl;
}
}
} int find_pos(int k , int x)
{
int l= , r=n- , ans=-;
while(r>=l){
int m=(l+r)>>;
if(val[k][m].first<=x) l=m+ , ans=m;
else r=m-;
}
return ans;
} bitset<N> getStatus(int k , int x)
{
int pos = find_pos(k , x);
bitset<N> ans;
if(pos<) return ans.reset();
int len = (pos+)/block;
int st = block*len;
if(len>=) ans = bs[k][len-];
else ans.reset();
for(int i=st ; i<=pos ; i++)
ans.set(val[k][i].second);
return ans;
} void query()
{
int x , last=;
bitset<N> ans[];
scanf("%d" , &q);
while(q--){
for(int i= ; i< ; i++) ans[i].reset();
for(int i= ; i< ; i++){
scanf("%d" , &x);
x ^= last;
ans[i] = getStatus(i , x);
if(i) ans[i] &= ans[i-];
// cout<<i<<" "<<x<<" "<<ans[i].to_string()<<endl;
}
last = ans[].count();
printf("%d\n" , last);
}
} int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--){
read();
query();
}
return ;
}

hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题的更多相关文章

  1. hihocoder1236(北京网络赛J):scores 分块+bitset

    北京网络赛的题- -.当时没思路,听大神们说是分块+bitset,想了一下发现确实可做,就试了一下,T了好多次终于过了 题意: 初始有n个人,每个人有五种能力值,现在有q个查询,每次查询给五个数代表查 ...

  2. 2015北京网络赛 J Scores bitset+分块

    2015北京网络赛 J Scores 题意:50000组5维数据,50000个询问,问有多少组每一维都不大于询问的数据 思路:赛时没有思路,后来看解题报告也因为智商太低看了半天看不懂.bitset之前 ...

  3. 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...

  4. Hiho coder 1236 2015 北京网络赛 Score

    五维偏序..一开始被吓到了,后来知道了一种BITSET分块的方法,感觉非常不错. 呆马: #include <iostream> #include <cstdio> #incl ...

  5. 2015北京网络赛 Couple Trees 倍增算法

    2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道.  解法来自 q ...

  6. 2015北京网络赛 D-The Celebration of Rabbits 动归+FWT

    2015北京网络赛 D-The Celebration of Rabbits 题意: 给定四个正整数n, m, L, R (1≤n,m,L,R≤1000). 设a为一个长度为2n+1的序列. 设f(x ...

  7. 2015北京网络赛 G题 Boxes bfs

    Boxes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingonl ...

  8. 2015北京网络赛 H题 Fractal 找规律

    Fractal Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingo ...

  9. 2015北京网络赛 A题 The Cats' Feeding Spots 暴力

    The Cats' Feeding Spots Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acm ...

随机推荐

  1. 使用 Velocity 模板引擎快速生成代码(zhuan)

    http://www.ibm.com/developerworks/cn/java/j-lo-velocity1/ ****************************************** ...

  2. C语言下动态库相互调用

    前段时间需要完成多个模块业务,而这些模块的接口都是一样的,于是为了方便管理就把每个模块都根据接口封装成了SO库,这里就留下SO库调用样例 SO库源文件代码: //TestSo.c #include & ...

  3. PacBio软件总览 - 初级分析

    PacBio® RS Software Overview PacBio运行的整个流程是什么?每一步都用到了什么软件? PacBio软件套件 RS Remote:Design runs remotely ...

  4. Android日常开发60条经验

    1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 2. 数据库表段字段常量和SQL逻辑分离,更清 ...

  5. 能源项目xml文件标签释义--DataSource

    <bean id="dataSource1" class="org.apache.tomcat.jdbc.pool.DataSource" destroy ...

  6. getsockname和getpeername

    int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);  // 获取与某个套接字关联的本地协议地址 i ...

  7. hdu5884 Sort(二分+k叉哈夫曼树)

    题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...

  8. SQL的常用语句

    select * from g_members where id between '16' and '31' order by id desc 倒序排列 select * from g_members ...

  9. HDU 3466

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  10. linux shell 当前时间

    #!/bin/bashdatestr=`date --date='today' "+%Y-%m-%d %H:%M:%S"`echo $datestr