【bzoj2741】[FOTILE模拟赛] L
Solution
突然沉迷分块不能自拔
考虑用分块+可持久化trie来解决这个问题
对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间的最大异或和,这个可以做到\(O(n\sqrt nlogn)\),实现上的话就是。。将一段区间\([l,r]\)的异或和写成\(sum[r]\ xor \ sum[l-1]\)的形式,然后对于每一个
\(i\)应该是\([L,i-1]\)的答案和所有以\(i\)结尾的子区间的异或和的最大值,右端点固定的话直接在可持久化trie里面查一下就好了(弱智如我一开始在这个地方莫名卡壳==)
然后查询的时候,如果说\(l,r\)在同一块里面,直接暴力查
如果不在同一块里面,把\(l\)所在的块单独处理一下,然后再用答案和下一块的块头\(x\)预处理出来的\([x,r]\)的答案取一下max即可
long long 警告qwq,所以trie的层数要开大一点。。
mark:可持久化trie在insert的时候记得newnode要放在d<0的判断之前。。
代码大概长这个样子
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
const int N=12010,M=6010,B=109+10;
ll a[N],sum[N];
int n,m,num,sq;
ll lastans;
namespace Trie{/*{{{*/
const int N=::N*40,TOP=33;//just for debuging!!!
int ch[N][2],rt[N],sz[N];
int tot;
void init(){tot=0; sz[0]=0; rt[0]=0; ch[0][0]=ch[0][1]=0;}
int newnode(int pre){
ch[++tot][0]=ch[pre][0]; ch[tot][1]=ch[pre][1]; sz[tot]=sz[pre];
return tot;
}
void _insert(int pre,int &x,ll delta,int d){
x=newnode(pre);
++sz[x];
if (d<0) return;
int dir=delta>>d&1;
_insert(ch[pre][dir],ch[x][dir],delta,d-1);
}
void insert(int pre,int x,ll delta){++pre; ++x;_insert(rt[pre],rt[x],delta,TOP);}
ll _query(int L,int R,ll delta,int d){
if (d<0) return 0;
int dir=delta>>d&1;
if (sz[ch[R][dir^1]]-sz[ch[L][dir^1]])
return (1LL<<d)+_query(ch[L][dir^1],ch[R][dir^1],delta,d-1);
return _query(ch[L][dir],ch[R][dir],delta,d-1);
}
ll query(int L,int R,ll delta){++L;++R; return L>R?0:_query(L?rt[L-1]:0,rt[R],delta,TOP);}
}/*}}}*/
ll rec[B][N];
int Id(int x){return (x-1)/sq+1;}
int St(int x){return (x-1)*sq+1;}
int Ed(int x){return x*sq;}
void prework(){
Trie::init();
for (int i=0;i<=n;++i)
Trie::insert(i-1,i,sum[i]);
int x;
num=Id(n);
for (int i=1;i<=num;++i){
x=St(i);
rec[i][x]=a[x];
for (int j=x+1;j<=n;++j)
rec[i][j]=max(rec[i][j-1],Trie::query(x-1,j-1,sum[j]));
}
}
ll query(int l,int r){
ll ret=0;
int numl=Id(l),numr=Id(r);
if (numl==numr){
for (int i=l;i<=r;++i)
ret=max(ret,Trie::query(i,r,sum[i-1]));
return ret;
}
if (l==St(numl))
ret=max(ret,rec[numl][r]);
else
for (int i=l;i<=Ed(numl);++i)
ret=max(ret,Trie::query(i,r,sum[i-1]));
ret=max(ret,rec[numl+1][r]);
return ret;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int l,r,x,y;
scanf("%d%d",&n,&m);
sum[0]=0; sq=sqrt(n);
for (int i=1;i<=n;++i)
scanf("%lld",a+i),sum[i]=sum[i-1]^a[i];
prework();
lastans=0;
for (int i=1;i<=m;++i){
scanf("%d%d",&x,&y);
l=min((1LL*x+lastans)%n+1,(1LL*y+lastans)%n+1);
r=max((1LL*x+lastans)%n+1,(1LL*y+lastans)%n+1);
lastans=query(l,r);
printf("%lld\n",lastans);
}
}
【bzoj2741】[FOTILE模拟赛] L的更多相关文章
- BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)
显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...
- BZOJ2741:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- bzoj 2741 [FOTILE模拟赛] L
Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
随机推荐
- 铁轨(rails, ACM/ICPC CERC 1997,Uva 514)
铁轨(rails, ACM/ICPC CERC 1997,Uva 514) 题目描述 某城市有一个火车站,铁轨铺设如图所示.有n节车厢从A方向驶入车站,按进站顺序编号为1~n.你的任务是让它们按照某种 ...
- 面向 Web 开发者的 Sublime Text 插件
Package Control 在 Sublime Text 上大家都用 Package Control 来管理安装插件,所以它是我们要安装的第一个插件,安装方法见这里.关于 Package Cont ...
- Tomcat java zabbix 监控
排除汤姆猫错误的步骤 ps-ef | grep java或jps –lvm 查看java pid进程 netstat –lntup | grep java 查看java 端口有没有启动 查看 tomc ...
- mkdir命令详情
基础命令学习目录首页 原文链接:https://blog.csdn.net/zwlove5280/article/details/74618041 mkdir 是创建目录的命令. 创建一级目录 mkd ...
- WinForm中从SQLite数据库获取数据显示到DataGridView
1.关于Sqlite Sqlite是一款开源的.适合在客户端和嵌入式设备中使用的轻量级数据库,支持标准的SQL. 不像SqlServer或Oracle的引擎是一个独立的进程.通过TCP或命名管道等与程 ...
- 2017-2018-2 『Java程序设计』课程 结对编程练习_四则运算
相关测试过程截图(JUnit) JudgeTest:对计算及将整数化为分数的测试 SuffixExpressionTest:中缀转后缀的测试 RationalNumberTest:对RationalN ...
- 20145214 《网络对抗技术》 Web基础
20145214 <网络对抗技术> Web基础 1.实验后回答问题 (1)什么是表单 表单在网页中主要负责数据采集,提供了填写数据.选择数据,收集数据并提交给后台的功能 一个表单有三个基本 ...
- 冲刺One之站立会议6 /2015-5-19
2015-5-19 今天把服务器端的界面完善了一下,然后大家查了好多资料,实现了登陆界面实际连接的功能,开始加了一个它和服务器的的跳转,但是分析过后发现这是个没有必要的跳转.登录应该直接转到聊天室的主 ...
- 软工实践-Beta 冲刺 (4/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 【动态规划】POJ-2229
一.题目 Description Farmer John commanded his cows to search for different sets of numbers that sum to ...