# [THUSC2015] 异或运算

news/2024/12/25 21:38:55/文章来源:https://www.cnblogs.com/LG017/p/18631461

P5795 [THUSC2015] 异或运算

题目描述

给定长度为 \(n\) 的数列 \(X={x_1,x_2,...,x_n}\) 和长度为 \(m\) 的数列 \(Y={y_1,y_2,...,y_m}\),令矩阵 \(A\) 中第 \(i\) 行第 \(j\) 列的值 \(A_{i,j}=x_i\ \operatorname{xor}\ y_j\),每次询问给定矩形区域 \(i∈[u,d],j∈[l,r]\),找出第 \(k\) 大的 \(A_{i,j}\)

对于 \(100\%\) 的数据

  • \(0\leq X_i,Y_j<2^{31}\),
  • \(1\leq u\leq d\leq n\leq 1000\),
  • \(1\leq l\leq r\leq m\leq 300000\),
  • \(1\leq k\leq (d-u+1)\times (r-l+1)\), \(1\leq p\leq 500\)

Solution:

我们发现数据范围十分的有意思,n,m及其的不对称,并且我们唯一能接受的多项式复杂度是 $ O(n \cdot q \cdot logm) $

我们维护一个可持久化 0/1 Trie,用来存每个b的值。然后对于每个查询,从31位开始往0位扫,在这个矩形中统计一下当前位 \(ig\) 为1的有多少,而统计的方式自然就是遍历 \(i \in [u,d]\) 查询对于每个 \(x_i\) ,假设它的第 \(ig\) 位是 \(now\)。我们需要统计在 $ -t[l-1]+t[r]$ 这颗树上,第 \(ig\) 位是 \(!now\) 的节点数

如果$ cnt \ge k$,说明这位必须取1,且将所有的主席树节点访问到 \(!now\) 如果不取的话那么排名至少为 \(cnt+1\)

如果 $cnt < k $,说明这位不能取1,但是在当前位 \(ig\)\(cnt\) 个比 \(ans\) 大的数,所以在我们的主席树进入 \(now\) 统计答案之前要先将 \(k-=cnt\)

然后这题就做完了

Code:

#include<bits/stdc++.h>
const int N=3e5+5;
using namespace std;
int a[N],b[N];
struct Trie{int cnt;int rt[N],L[N],R[N];struct Tree{int ch[2],cnt;}t[N*50];inline void insert(int &x,int y,int val,int len){t[x=++cnt]=t[y];t[x].cnt++;if(len<0)return ;int now=(val>>len)&1;insert(t[x].ch[now],t[y].ch[now],val,len-1);}int query(int x,int y,int l,int r,int k){int res=0;for(int i=x;i<=y;i++){L[i]=rt[l-1];R[i]=rt[r];}for(int ig=31;ig>=0;ig--){int cnt=0;for(int i=x;i<=y;i++){int now=(a[i]>>ig)&1;cnt+= -t[t[L[i]].ch[!now]].cnt+t[t[R[i]].ch[!now]].cnt;}if(cnt>=k)//这一位取1至少有 k 个 (这一位如果不取1,排名至少是cnt+1){res|=(1<<ig);//这位要取1for(int i=x;i<=y;i++){int now=(a[i]>>ig)&1;L[i]=t[L[i]].ch[!now];R[i]=t[R[i]].ch[!now];}}else //这位不取1{k-=cnt;for(int i=x;i<=y;i++){int now=(a[i]>>ig)&1;L[i]=t[L[i]].ch[now];R[i]=t[R[i]].ch[now];}}}return res;}}T;
int n,m,q;
void work()
{cin>>n>>m;for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=m;i++){scanf("%d",&b[i]);T.insert(T.rt[i],T.rt[i-1],b[i],31);}cin>>q;for(int i=1,x,y,l,r,k;i<=q;i++){scanf("%d%d%d%d%d",&x,&y,&l,&r,&k);int ans=T.query(x,y,l,r,k);printf("%d\n",ans);}
}
int main()
{//freopen("P5795_1.in","r",stdin);freopen("P5795.out","w",stdout);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858854.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R数据分析:工具变量回归的做法和解释,实例解析

前几天看了个视频,是2024年诺贝尔经济学奖得主在分享自己的研究,研究问题是“制度如何形成并影响经济繁荣”,在研究这个问题的时候他的PPT中提到研究的统计过程中用到了工具变量,想着再次大家介绍一下这个方法。说不定利用这个方法,哪天我的读者里面也出个诺贝尔奖得主呢,…

昆工25考研复试时间预测(信自院)

昆工昆明理工大学、计算机技术、人工智能、软件工程、网络空间安全、891计算机专业核心综合、计算机系统结构、计算机软件与理论、计算机应用技术、通信工程、817信号与系统、信号与信息处理、通信与信息系统、通信工程(含宽带网络、移动通信等)

WebP图片格式

WebP WebP 是一种图片文件格式,由 Google 开发,用于提供更好的图像压缩性能。支持有损压缩和无损压缩,同时支持透明度(类似 PNG 格式的 alpha 通道)和动画(类似 GIF 格式)。 WebP特点高效压缩 •有损压缩:与 JPEG 相比,WebP 的文件体积更小,同时保持类似的图像质量。…

谁让你创建两个对象的?

如果CLASSPATH下有两个不同版本的jar包,一个版本的jar包有@Component注解,另外一个版本没有,Spring到底会不会创建Bean?问题现象 之前遇到过一个问题,在一个微服务的目录下有相同功能 jar 包的两个不同的版本,其中一个版本里面的类有 @Component 注解,另外一个版本的类里…

打印三角形金字塔 、debug、java的方法、命令行传参、可变参数20241225

打印三角形金字塔 debug20241225package com.pangHuHuStudyJava.struct; public class Print_Tran {public static void main(String[] args) {for (int j = 0; j < 5; j++) {for (int r = 5; r > j; r--) {System.out.print( );}for (int s = 0; s < ((2*j)+1); s++…

OpenAI o3模型震撼发布:编程界的革命性突破,程序员的未来将何去何从?

当人工智能踏足编程领域,生产力的提升让人瞠目结舌。就在近日,OpenAI 发布了全新的 o3模型,其强大的代码生成能力和上下文理解能力,将编程带入了一个全新的时代。是机遇还是挑战?程序员们将如何面对这场技术风暴?o3模型究竟有何与众不同之处?它的发布会对程序员和整个软…

[Java/压缩] Java读取Parquet文件

序:契机生产环境有设备出重大事故,又因一关键功能无法使用,亟需将生产环境的原始MQTT报文(以 parquet 文件格式 + zstd 压缩格式 落盘)DOWN到本地,读取并解析。本文聚焦在 本地电脑,用 java 读取 parquet 文件相当多网络文档的读取代码无法正常运行,有必要记录一二,后续…

莫队从入门到人门

普通莫队 详介(P2709 小B的询问) 普通莫队处理问题的前提是问题可以离线,多次区间查询,\(O(n\sqrt m)\) 能过。 我们以 P2709 小B的询问 为例,假设当前区间为 \([l,r]\),答案为 \(ans\),那么 \(r\) 右移一位时,新加入一个数 \(x\),我们只要把 \(ans\) 加上 \(x\) 的贡…

nacos安装注意事项

一年多没玩了,都快忘了,最新版本已经2.3.x了 3.0也快问世了 Linux/Unix/Mac 单机启动命令: sh startup.sh -m standalone Windows startup.cmd -m standalone如果直接未启动就是集群模式,但是要注意nacos.properties里面配置集群信息本文来自博客园,作者:余生请多指教ANT…

PWN系列-2.27版本利用setcontext实现orw

PWN系列-2.27版本利用setcontext实现orw 知识 开启沙箱之后,我们就只能用orw的方式来得到flag。 这篇博客主要讲通过劫持__free_hook或者__malloc_hook利用setcontext在libc或者heap上执行rop或者shellcode。 在free堆块的时候,rdi会指向堆块,在检测到__free_hook有值的情况…

shell语法保姆级教程

Shell脚本 建立一个sh脚本 touch 1.sh (新建脚本文件)vi 1.sh(编写文件内容)按 i 可以写入内容,按esc :wq退出并保存解释 1、创建脚本文件 2、脚本文件中第一行为指定脚本编译器:# !/bin/bash 最终调用的都是dash执行shell脚本命令: 1、./1.sh难道我们必须要修改权限才能执…

从0开始学uniapp——认识HBuilderX

为什么使用uniapp:可以多端运行,写好了这一套可以用在h5,安卓程序,小程序多端,很方便。1.百度搜HBuilderX,使用该编译器学习uniapp 2.新建一个默认项目 pages——用于存放页面,这里都是.vue后缀的页面, pages.json——用于存放路由pages数组里按例子添加即可,HBuilder…