【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】

2024-02-20 15:18

本文主要是介绍【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∈[u,d],j∈[l,r],找出第k大的Aij。

Input

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

第二行包含n个非负整数xi
第三行包含m个非负整数yj
第四行包含一个正整数p,表示询问次数
随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含义如题意所述。

Output

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

Sample Input

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

Sample Output

6
5
1

HINT

 对于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

题解:

           注意到p,u,d都很小,所以可以对第二维建可持久化trie,然后枚举第一维.

           查询的时候在可持久化trie上跑一遍即可.

           注意查询的时候对需要每个数记录一下当前它在trie树上的位置.

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 300010 
using namespace std;
int bin[35],ch[N*32][2],sum[N*32],root[N],n,m,l,r,k,u,d,num,cnt,Q,a[N],b[N];
struct use{int x,y,v;}q[N];
int insert(int x,int v){int t,y;t=y=++cnt;for (int i=30;i>=0;i--){int t=v&bin[i];t>>=i;ch[y][0]=ch[x][0];ch[y][1]=ch[x][1];y=ch[y][t]=++cnt;x=ch[x][t];sum[y]=sum[x]+1; }return t;
}
int query(int k){int ans(0);for (int i=30;i>=0;i--){int size(0);for (int j=1;j<=num;j++){int t=(q[j].v)&bin[i];t>>=i;size+=sum[ch[q[j].y][t^1]]-sum[ch[q[j].x][t^1]];}if (size>=k){ans+=bin[i];for (int j=1;j<=num;j++){int t=(q[j].v)&bin[i];t>>=i;q[j].x=ch[q[j].x][t^1];q[j].y=ch[q[j].y][t^1];}}else{k-=size;for (int j=1;j<=num;j++){int t=(q[j].v)&bin[i];t>>=i;q[j].x=ch[q[j].x][t];q[j].y=ch[q[j].y][t];}}}return ans;
}
int main(){scanf("%d%d",&n,&m);bin[0]=1;for (int i=1;i<=30;i++) bin[i]=bin[i-1]*2;for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (int i=1;i<=m;i++) scanf("%d",&b[i]),root[i]=insert(root[i-1],b[i]);scanf("%d",&Q);for (int i=1;i<=Q;i++){scanf("%d%d%d%d%d",&u,&d,&l,&r,&k);num=0;for (int j=u;j<=d;j++) q[++num]=use{root[l-1],root[r],a[j]};printf("%d\n",query(k));}
}


这篇关于【bzoj4103】 【Thu Summer Camp 2015】【异或运算】【可持久化trie】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728640

相关文章

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前,不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础,因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示,很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间的互相转换。 十进制转二进制 十进制转二进制可以使用常见的 除2取余法 进行。每次将十进制除以2并记录所得余数,直到商为0,然后再将记录的余数 从下往上排列即

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

iptables持久化命令:netfilter-persistent save

在Linux上,使用netfilter-persistent命令可以保存iptables防火墙规则,确保它们在系统重启后仍然有效。以下是如何使用netfilter-persistent来保存iptables规则的步骤: 打开终端:首先,你需要打开Linux系统的终端。保存规则:使用netfilter-persistent save命令可以保存当前的iptables规则。这个命令会调用所有插件,将

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)-CSDN博客 做完了数据结构类,该做一个存储类了,也就是生成一个字典类(只是声明)  实现和上一节的数据结构类的方式大同小异,所

快速幂运算的一些模板

这里用递归和循环两种做法来做。 简单来说,快速幂就是把底数扩大,指数缩小,比如2*2=4;计算2的幂时,就可以转换成4的幂来运算,这样可以避免在计算大的数据时爆int的现象  //递归int power(int a,int n){int ans;if(n==2) ans=1;else{ans=power(a*a,n/2);if(n%2==1) ans*=a;}return ans;}

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl