BZOJ2741 【FOTILE模拟赛】L 【可持久化trie + 分块】

题目

FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和。
即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r。
为了体现在线操作,对于一个询问(x,y):
l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
其中lastans是上次询问的答案,一开始为0。

输入格式

第一行两个整数N和M。
第二行有N个正整数,其中第i个数为Ai,有多余空格。
后M行每行两个数x,y表示一对询问。

输出格式

共M行,第i行一个正整数表示第i个询问的结果。

输入样例

3 3

1 4 3

0 1

0 1

4 3

输出样例

5

7

7

提示

HINT

N=12000,M=6000,x,y,Ai在signed longint范围内。

题解

区间异或和最大,转化为两个前缀和

多次询问不同区间,用可持久化trie树

但每次要任意选出两个数,而常规的trie树只支持一个数询问区间和它的最大异或值,不能处理区间内任意两个数异或和最大值
何破?

我们不可能每次询问\(O(n^2logn)\)枚举其中一个数
那就预处理!
如果我们能预处理出每个区间异或最大值,就是\(O(n^2logn)\)预处理,\(O(1)\)查询

能不能均摊一下?
分块!
我们只预处理每个块头到其后面所有位置的数异或的最大值
具体的,设\(f[i][j]\)表示\(i\)块开头位置到\(j\)中所有数异或的最大值,记块头为\(u\),则\(f[i][j]\)即为区间\([u,j]\)的答案
算出\(f[i][j]\)只需要枚举每个\(j\)就可以了
具体地,\(f[i][j] = max(f[i][j - 1],query(j,区间[u,j - 1]))\)

那么每次询问的时候,对于\(l\)之后的第一个块头\(u\),可以得到出后面的答案\(f[u][r]\)
所以我们只需要计算区间\([l,u - 1]\)的数与其后面的数的最大异或值
这个区间大小不会超过\(\sqrt{n}\),所以可以直接统计

总的复杂度\(O(n\sqrt{n}logn)\)
【坑点,给出的x,y可能超过int范围】

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define LL long long int
using namespace std;
const int maxn = 12005,Bit = 31,maxm = 6000000,INF = 100000000;
inline LL read(){LL out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
LL n,m,A[maxn],sum[maxn],bin[40];
LL f[200][maxn],block[maxn],B,lans;
struct trie{int ch[maxm][2],sum[maxm],rt[maxn],cnt;int ins(int pre,int x){int tmp,u;tmp = u = ++cnt;for (int i = Bit; i >= 0; i--){ch[u][0] = ch[pre][0];ch[u][1] = ch[pre][1];sum[u] = sum[pre] + 1;LL t = x & bin[i]; t >>= i;pre = ch[pre][t];u = ch[u][t] = ++cnt;}sum[u] = sum[pre] + 1;return tmp;}LL query(int u,int v,int x,int dep){if (dep < 0) return 0;LL t = x & bin[dep]; t >>= dep;if (sum[ch[u][t ^ 1]] - sum[ch[v][t ^ 1]])return bin[dep] + query(ch[u][t ^ 1],ch[v][t ^ 1],x,dep - 1);return query(ch[u][t],ch[v][t],x,dep - 1);}
}T;
int main(){bin[0] = 1; for (int i = 1; i <= Bit; i++) bin[i] = bin[i - 1] << 1;n = read(); m = read(); B = (int)sqrt(n) + 1;n++;for (int i = 2; i <= n; i++) A[i] = read();for (int i = 1; i <= n; i++){sum[i] = sum[i - 1] ^ A[i];T.rt[i] = T.ins(T.rt[i - 1],sum[i]);block[i] = i / B;}for (int i = 1; i <= n; i++){if (i == 1 || block[i] != block[i - 1]){int b = block[i];for (int j = i; j <= n; j++){f[b][j] = max(f[b][j - 1],T.query(T.rt[j - 1],T.rt[i - 1],sum[j],Bit));}}}n--;LL l,r,x,y;while (m--){x = read(); y = read();l = min (((x + lans) % n) + 1, ((y + lans) % n) + 1);r = max (((x + lans) % n) + 1, ((y + lans) % n) + 1) + 1;lans = 0;if (block[l] != block[r]) lans = f[block[l] + 1][r];for (int i = l; block[i] == block[l] && i < r; i++){lans = max(lans,T.query(T.rt[r],T.rt[i],sum[i],Bit));}printf("%lld\n",lans);}return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8711218.html

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

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

相关文章

php输出mysql的数据结构_php课程 13-43 mysql的数据结构是什么

php课程 13-43 mysql的数据结构是什么一、总结一句话总结&#xff1a;cs结构&#xff0c;客户端&#xff0c;服务器1、常用的比较出名的数据库有哪些&#xff1f;SQL数据库(关系型):1.收费:DB2SqlserverOracle2.开源免费MysqlSqlitePostgresqlNOSQL数据库(非关系型):1.MongoDB(…

11大领域148个热点和新兴前沿发布!有你的化学与材料研究方向吗?

来源&#xff1a;科学网 作者&#xff1a;郑金武11月13日&#xff0c;中国科学院科技战略咨询研究院、中国科学院文献情报中心与科睿唯安联合向全球发布了《2020研究前沿》报告。报告基于2014年-2019年的论文数据&#xff0c;遴选展示了在农业科学、植物学和动物学&#xff0c…

List注意啊

java.unit工具类&#xff0c;例如&#xff1a;Map、List等 java.awt图形绘制类&#xff0c;例如&#xff1a;list组件可以为用户提供了一个可滚动的文件列表选项&#xff0c;可设置list使其为用户提供单项或多项选择 我在第一次使用List的时候&#xff0c;包导入了第二个&#…

python中反斜杠_Python中的正斜杠/与反斜杠\

知识点&#xff1a;1. "/"左倾斜是正斜杠&#xff0c;"\"右倾斜是反斜杠&#xff0c;可以记为&#xff1a;除号是正斜杠2. 对于目录分隔符&#xff0c;Unix和Web用正斜杠/&#xff0c;Windows用反斜杠\。(一)目录中的斜杠python读文件需要输入的目录参数&a…

git idea 图形化_Git大全,你所需要的Git资料都在这里

不管怎样&#xff0c;Git已经成为事实上的版本管理工具的王者&#xff0c;之前的CVS被SVN吃掉了&#xff0c;现如今SVN的大好河山也被Git蚕食了大半&#xff0c;作为开发者的你&#xff0c;如果还不能够熟练的使用Git来管理你的代码&#xff0c;后果将会很严重&#xff0c;何况…

是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而&#xff0c;一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树&#xff0c;都得到一样的结果。于是对于输入的各种插入序列&#xff0c;你需要判断它们…

perl mysql dml_MySQL Connector执行SQL语句的三种方式

描述当我们需要在Java程序中与数据库进行交互&#xff0c;可能首先想到的是使用某个ORM框架&#xff0c;因为ORM框架封装了一些实现细节&#xff0c;在使用上非常方便&#xff0c;并且一定程度上可以提升代码稳定性。在ORM框架中&#xff0c;都会依赖MySQL Connector包&#xf…

修改软件许可证使用时间_阮一峰:为什么开源数据库改变许可证?

CockroachDB 是一个开源的分布式数据库&#xff0c;最近改变了代码授权&#xff0c;放弃了 Apache 许可证。许多开源数据库这一两年都改变了授权&#xff0c;比如 Confluent、Elastic 、MongoDB、Redis Labs、TimescaleDB。本文分析这种现象。一、CockroachDB 的许可证变更Cock…

mysql数据库设计三大范式_数据库设计三大范式详解

引言数据库的设计范式是数据库设计所需要满足的规范&#xff0c;满足这些规范的数据库是简洁的、结构明晰的&#xff0c;同时&#xff0c;不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟&#xff0c;不仅给数据库的编程人员制造麻烦&#xff0c;…

Broadcast简单使用

Activity Service之间的通信单用intent有时候还是不能满足要求&#xff0c;毕竟intent只能在启动一个activity的时候传一点消息过去 这个时候就用到广播了&#xff0c;至此&#xff0c;四大组件Activity Broadcast Service ContentProvider中终于用过三个了。。。当然目前只是…

线程 sleep 取消_C/C++ 多线程机制

一、C/C多线程操作说明C/C多线程基本操作如下&#xff1a; 1. 线程的建立结束 2. 线程的互斥和同步 3. 使用信号量控制线程 4. 线程的基本属性配置 在C/C代码编写时&#xff0c;使用多线程机制&#xff0c;首先需要做的事情就是声明引用&#xff0c;具体如下&#xff1a;#inclu…

Windows + Ubuntu下JDK与adb/android环境变量配置完整教程

假设JDK和android sdk路径分别如下&#xff1a; D:\Program Files\Java\jdkD:\android-sdk 1.JDK环境变量配置JAVA_HOMED:\Program Files\Java\jdk path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; classpath,;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar &a…

python制作界面怎么触发事件_python模拟事件触发机制详解

本文实例为大家分享了python模拟事件触发机制的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下EventManager.py# -*- encoding: UTF-8 -*-# 系统模块from queue import Queue, Emptyfrom threading import *class EventManager:def __init__(self):"""…

python 格式化工具_小而美的 Python 格式化工具--black

Black号称不妥协的代码格式化工具&#xff0c;为什么叫不妥协呢&#xff1f;因为它检测到不符合规范的代码风格直接就帮你全部格式化好&#xff0c;根本不需要你确定&#xff0c;直接替你做好决定。它也是 requests 作者最喜欢的工具之一.使用非常简单&#xff0c;安装成功后&a…

常用英语短语收集1

1、are you fucking kiding me&#xff1f; 转载于:https://www.cnblogs.com/badboys/p/8729474.html

事务java_Java事务之一——Java事务的基本问题

Java中的事务处理有多简单&#xff1f;在使用EJB时&#xff0c;事务在我们几乎察觉不到的情况下发挥着作用&#xff1b;而在使用Spring时&#xff0c;也只需要配置一个TransactionManager&#xff0c;然后在需要事务的方法上加上Transactional注解就行了。Java的事务处理之所以…

seo模拟点击软件_浅谈百度SEO快排是什么、原理、如何判断及应对

前言&#xff1a;以前我说过不准备写这个快排&#xff0c;一是我自己的网站没有操作过所谓的快排 &#xff0c;二是我并不能像网上很多写的揭秘百度快排(说实话&#xff0c;你都能揭秘的方法了&#xff0c;还真的很有用吗?真正懂的人都在低调赚money)。我只是站在一个小白角度…

冲刺no.4

项目:ccsu小助手 角色:用户 访问链接:http://47.93.57.6:8888/login/ 目的(Purpose) ccsu小助手是一款面向长沙学院所有学生、老师、学校部门、校园的账户信息输出类产品&#xff0c;部门可以通过和本系统负责人签订产品使用协议&#xff0c;申请集成使用该产品 对应网页使用权…

java web 开发基础_javaweb开发基础(一)

001使用MyEclispe建立web工程我的建立在D盘WebAPP这个目录下在myeclipse中启动Tomcat&#xff0c;在浏览器中输入http://localhost:8080/&#xff0c;如果不出意外的话&#xff0c;会出现白板&#xff0c;说明Tomcat启动成功。这篇文档则详细的说明了如何在MyEclipse下部署一个…

python如何处理视频_OpenCV-Python系列之视频处理入门

视频处理在OpenCV中处于极为重要的地位&#xff0c;目标实时跟踪等各种实时图像处理算法都是以视频为基础。从相机捕获视频首先我们来了解一下使用电脑自带的相机来进行捕获视频。通常&#xff0c;我们必须使用摄像机捕获实时流。OpenCV提供了一个非常简单的界面来执行此操作。…