内存限制:512 MiB 时间限制:1000 ms

题目描述

给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij。

输入格式

第一行包含两个正整数n,m,分别表示两个数列的长度

第二行包含n个非负整数xi

第三行包含m个非负整数yj

第四行包含一个正整数p,表示询问次数

随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含义如题意所述。

输出格式

共p行,每行包含一个非负整数,表示此次询问的答案。

样例

样例输入

3 3
1 2 4
7 6 5
3
1 2 1 2 2
1 2 1 3 4
2 3 2 3 4

样例输出

6
5
1

数据范围与提示

对于100%的数据,0<=Xi,Yj<2^31,

1<=u<=d<=n<=1000,

1<=l<=r<=m<=300000,

1<=k<=(d-u+1)*(r-l+1),

1<=p<=500


区间有关异或的问题,都可以用trie树解决

本题的$m$,显然用可持久化trie维护

对于每个询问,考虑枚举$[u,d]$,在区间$[l,r]$上的trie中查询。

每次从答案的最高位开始,判断区间内该位为$1$的A_{i,j}的个数,如果$>=k$则答案的该位则为$1$。

对每个枚举的$i(u<=i<=d)$,维护$L,R$两个指针表示当前询问的区间,每次判断完更新

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int read(){
char c=getchar(); int x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+c-,c=getchar();
return x;
}
#define N 1005
#define M 300005
int n,m,a[N],L[N],R[N];
int u,rt[M],nx[M*][],sum[M*];
void ins(int o,int p,int d,int v){
int k=(v>>d)&;
nx[o][!k]=nx[p][!k];
sum[nx[o][k]=++u]=sum[nx[p][k]]+;
if(d) ins(nx[o][k],nx[p][k],d-,v);
}
int ask(int l,int r,int k,int d){
if(d<) return ;
int tt=,b=<<d;
for(int i=l;i<=r;++i){
if(a[i]&b) tt+=sum[nx[R[i]][]]-sum[nx[L[i]][]];
else tt+=sum[nx[R[i]][]]-sum[nx[L[i]][]];
}
if(tt>=k){//该位为1的个数>=k,说明答案的该位为1
for(int i=l;i<=r;++i){
if(a[i]&b) L[i]=nx[L[i]][],R[i]=nx[R[i]][];
else L[i]=nx[L[i]][],R[i]=nx[R[i]][];
}
return ask(l,r,k,d-)|b;
}else{
for(int i=l;i<=r;++i){
if(a[i]&b) L[i]=nx[L[i]][],R[i]=nx[R[i]][];
else L[i]=nx[L[i]][],R[i]=nx[R[i]][];
}
return ask(l,r,k-tt,d-);
}
}
int main(){
n=read(); m=read();
for(int i=;i<=n;++i) a[i]=read();
for(int i=;i<=m;++i) rt[i]=++u,ins(rt[i],rt[i-],,read());
for(int Q=read(),l1,l2,r1,r2,k;Q;--Q){
l1=read(),l2=read(),r1=read(),r2=read(),k=read();
for(int i=l1;i<=l2;++i) L[i]=rt[r1-],R[i]=rt[r2];
printf("%d\n",ask(l1,l2,k,));
}return ;
}

bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)的更多相关文章

  1. [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...

  2. 【bzoj4103】[Thu Summer Camp 2015]异或运算 可持久化trie树

    Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i ...

  3. BZOJ 4103: [Thu Summer Camp 2015]异或运算 可持久化trie

    开始想了一个二分+可持久化trie验证,比正解多一个 log 仔细思考,你发现你可以直接按位枚举,然后在可持久化 trie 上二分就好了. code: #include <bits/stdc++ ...

  4. BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】

    题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...

  5. bzoj4103: [Thu Summer Camp 2015]异或运算

    对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上 ...

  6. 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie

    我们观察数据:树套树 PASS    主席树 PASS  一层一个Trie PASS 再看,异或!我们就把目光暂时定在01Tire然后我们发现,我们可以带着一堆点在01Trie上行走,因为O(n*q* ...

  7. 【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

    4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 De ...

  8. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  9. 【BZOJ 4104】【Thu Summer Camp 2015】解密运算

    http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include& ...

随机推荐

  1. print和赋值

    赋值 #可同时(并行)给多个变量赋值 x, y, z = 1, 2, 3 #交换多个变量的值 x, y = y, x 序列解包(或可迭代对象解包):将一个序列(或任何可迭代对象)解包,并将得到的值存储 ...

  2. Mysql包的下载

    官方下载地址: https://dev.mysql.com/downloads/mysql/5.5.html#downloads mysql的下载界面 二进制的包 通用的RPM包 源码包

  3. 通过ecplise导入mysql的jar包时,右键找不到build path问题

    当我们执行java连接数据库程序的时候,我们需要再我们的项目里导入mysql的jar包,这时,我们需要右键->build path进行导入,但是有时候我们右键的时候并没有出现build path ...

  4. 基于thinkphp开发的项目部署到由宝塔面板创建的LNMP服务器上解决路径出错问题

    一. 环境与版本: 主机:amazon aws EC2主机 系统:Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1039-aws x86_64) 面板:宝塔免费版 6.9. ...

  5. js 扫码枪的输入

    关于js 获取扫码枪的输入获取方式,之前在网上搜了好多,都是大同小异的,都是说扫码枪输入的时间间隔不会超过30毫秒.但事实上我拿了几台电脑测试的结果是,有的时间间隔甚至超过了100毫秒,所以用时间间隔 ...

  6. windows下mingw编译faac

    进入目录先运行 ./bootstrap 接着就可以 ./configure --without-mp4v2 然后 make make install

  7. sqlalchemy.exc.InvalidRequestError: Table 'run_result' is already defined for this MetaData instance

    临时解决办法: 在models文件导入db后,加上如下代码: db.metadata.clear() 但解决问题的根本之处还是在于找到,为何会声明了2次类的定义呢? 解析: table 'roles_ ...

  8. 设计模式(4): 给组件实现单独的store

    概述 最近最近做项目的时候总会思考一些大的应用设计模式相关的问题,我把自己的思考记录下来,供以后开发时参考,相信对其他人也有用. 组件自身的store 我们在开发组件的时候,时常都有这种需求,就是希望 ...

  9. maven 配置参数详解!

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  10. Collector的使用

    一.Collector的引入 1)Collector的聚合作用前面已经使用过,将list.stream后的一系列操作之后再返回list. 2)Collector的引入,通过需求:将绿色的Apple放在 ...