相当好的题目,虽然和我前几天出的题重了qwq。

\(lmx\) 是我们的红太阳,没有他我们就会死!!!


暴力枚举一个端点,然后用可持久化 \(01\ Trie\) 或者离线 \(Trie\)(当然这题用不了,但不强制在线的话是可以的)得到答案。时间复杂度 \(O(nm\log n)\),过不了,考虑优化。

红太阳 \(lmx\) 曾经说过:当你遇到任何一个数据结构不好处理的问题是,就可以使用分块。于是设块长为 \(k\),\(as_{i,j}\) 表示以第 \(i\) 到 \(j\times k-k+1\) 个点为左端点,以第 \(j\) 个块内的点作为右端点的区间最大异或和,\(xm_i\) 表示第 \(i\) 个块内部的点作为左右端点的区间最大异或和。

\(as_{i,j}\) 可以通过可持久化 \(Trie\ +\) 后缀最大值的方法求得,\(xm_i\) 直接枚举端点。预处理时间复杂度 \(O(\frac{n^2\log n}k)\)。

询问的时候边角用处理 \(xm_i\) 的方法处理(当然也可以预处理),整块直接调用 \(as_{l,i}\) 和 \(xm_i\) 即可。询问时间复杂度 \(O(mk\log n)\),预处理的话是 \(O(mk)\)。

容易发现 \(k=\sqrt n\) 时相对优秀,所以时间复杂度为 \(O((n+m)\sqrt n\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=12005,M=5e5+5,K=205;
int n,m,sm[N],rt[N],ch[M][2];
int kl,as[N][K],xm[K],la,tot;
void add(int &x,int y,int v,int id){
if(!x) x=++tot;
if(id<0) return;
int c=((v>>id)&1);
ch[x][c^1]=ch[y][c^1];
add(ch[x][c],ch[y][c],v,id-1);
}int ans(int x,int y,int v,int id){
if(id<0) return 0;
int c=1-((v>>id)&1);
if(ch[x][c]==ch[y][c])
return ans(ch[x][c^1],ch[y][c^1],v,id-1);
return (1ll<<id)+ans(ch[x][c],ch[y][c],v,id-1);
}int lt(int x){return min(x*kl,n);}
int ft(int x){return x*kl-kl+1;}
int idx(int x){return (x-1)/kl+1;}
void init(int id,int m){
int fs=rt[m],ls=rt[lt(id)+1];
for(int i=m;i;i--)
as[i][id]=ans(fs,ls,sm[i-1],35);
for(int i=m;i;i--)
as[i][id]=max(as[i][id],as[i+1][id]);
for(int i=m;i<=lt(id);i++)
xm[id]=max(xm[id],ans(rt[m-1],rt[i],sm[i],35));
}int maxn(int l,int r){
int lk=idx(l),rk=idx(r),re=0;
if(lk==rk){
for(int i=l;i<=r;i++)
re=max(re,ans(rt[l-1],rt[i],sm[i],35));
return re;
}for(int i=l;i<=lt(lk);i++)
re=max(re,ans(rt[l-1],rt[i],sm[i],35));
for(int i=lk+1;i<rk;i++) re=max({re,as[l][i],xm[i]});
for(int i=ft(rk);i<=r;i++)
re=max(re,ans(rt[l-1],rt[i],sm[i],35));
return re;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m,kl=sqrt(n);
add(rt[0],0,0,35),add(rt[1],rt[0],0,35);
for(int i=1;i<=n;i++){
cin>>sm[i],sm[i]^=sm[i-1];
add(rt[i+1],rt[i],sm[i],35);
}for(int j=1;j<=n;j+=kl) init(idx(j),j);
while(m--){
int x,y;cin>>x>>y,x=x%n+n,y=y%n+n;
int l=min((x+la)%n+1,(y+la)%n+1);
int r=max((x+la)%n+1,(y+la)%n+1);
la=maxn(l,r),cout<<la<<"\n";
}return 0;
}

[BZOJ2741][FOTILE模拟赛] L 题解的更多相关文章

  1. BZOJ2741:[FOTILE模拟赛]L

    Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...

  2. BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)

    显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...

  3. 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

    Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...

  4. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

    题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...

  5. 【bzoj2741】[FOTILE模拟赛] L

    Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...

  6. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

    题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...

  7. bzoj 2741 [FOTILE模拟赛] L

    Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...

  8. 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树

    [BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...

  9. BZOJ2741: 【FOTILE模拟赛】L

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1170  Solved: 303[Submit][Status] ...

  10. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] ...

随机推荐

  1. 0. RyuJIT Tutorials - RyuJIT 的历史和架构

    目录 上一篇:无 下一篇:待更新 正文 RyuJIT - 即 .NET 的 JIT 编译器,负责将 IL 代码编译为最终用于执行的机器代码. 本系列为 RyuJIT 教程,将分为多篇进行更新发布,旨在 ...

  2. Java基础 —— 反射

    动态语言  动态语言,是指程序在运行时可以改变其结构(新函数可以引进,已有的函数可以被删除等结构上的变化).如:JavaScript.Python就属于动态语言,而C.C++则不属于动态语言,从反射的 ...

  3. 拥抱云原生,数据湖加速器 GooseFS 助力 Fluid 数据缓存实现

    01 ​前言 数据湖加速器 GooseFS 是由腾讯云推出的高性能.高可用.弹性的分布式缓存方案.依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖 ...

  4. 渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)

    本文是高级前端加解密与验签实战的第6篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过RSA加密来爆破登录. 分析 这里的代码跟上文的类似,但是加密的公钥是通过请求服 ...

  5. 【报错解决】【Linux】Name or service not known

    # 配置文件位置 /etc/sysconfig/network-scripts/ # nano ifcfg-eth0查看网卡配置,确认dns已配置,且网关已配置 在虚拟机中添加临时路由网关(要与物理主 ...

  6. shell 读取文件内容到数组

    在 shell 脚本中,可以使用下面的语法来读取文件内容并将其存储到数组中:   bash 复制代码 array=() while read line; do array+=("$line& ...

  7. Qt编写物联网管理平台31-用户权限管理

    一.前言 随着需求的不断变化,功能的增多,在用户信息这块,除了需要用户登录退出验证以外,还需要有个简单的用户权限逻辑处理,比如限定某些用户只有查看权限,没有删除记录.清空记录.系统设置的权限,与之相对 ...

  8. 记一次简单的存储过程和Pivot行转列

    首先我很讨厌写存储过程,其次我很讨厌 没办法,主要是需要进行 行转列,项目经理说可以用Pivot.我不是很精通sql,但是我会百度呀~ pivot需要有确定的列名.那我这个项目里面没办法确定,最后问了 ...

  9. VSTO踩坑记录(2)- 运用outlook对象模型发送邮件

    概述 上篇文章记录了怎么样让vsto插件显示在功能区上面,这篇文章来说说怎么运用微软提供的对象方法对outlook进行操作,附上官方文档. 这次示例我们来用代码发一封邮件,先简单拉几个控件,分别代表要 ...

  10. ls小技巧

    一.ls -rt ls的功能是列出指定路径下的所有文件,但是有时候文件太多,不方便查找哪些是新生成的文件时,可以使用ls -t或ls -rt命令. ls -t ls -rt 那是什么意思呢?这里-t就 ...