【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] ...
随机推荐
- c++ getline()和get()的区别
1.方法get(char &)和get(void)提供不跳过空白的单字符输入功能:2.函数get(char * , int , char)和getline(char * , int , cha ...
- Android工程导入Unity3D(避坑版)
最近与各种牛逼的项目管理软件打交道,比如SourceTree,要看英文版的才看得懂,中文反而不会用!... 这篇博客适合没怎么接触过安卓的小伙伴们,网上也有很多相关的教程,但是大多都没有具体的操作或则 ...
- Annotation 使用备忘2
title: Annotation 使用备忘 date: 2018-01-02 20:48:43 tags: [Annotation] categories: [Programming,Java] - ...
- find 删除文件
find 目录 -type f -name '*' -print0 | xargs -0 rm
- centos 切换用户显示bash-4.2$,不显示用户名路径的问题
原文链接: http://blog.csdn.net/testcs_dn/article/details/70482468
- Maven学习记录3——创建、编译、打包、运行项目
http://blog.csdn.net/yaya1943/article/details/48464371
- Final冲刺贡献分
小组名称:Hello World! 项目名称:空天猎 组长:陈建宇 成员:刘成志.刘耀泽.刘淑霞.黄泽宇.方铭.贾男男 一.贡献分数规则: (1)基础分:5 , 4 ,4 , 3 , 2 ,2 ,1. ...
- Notes of Daily Scrum Meeting(11.3)
Notes of Daily Scrum Meeting(11.3) 2014年11月3日 星期一 20:00—20:30 团队成员 今日团队任务 当日工作分配额 完成情况 陈少杰 阅读理解代码中 ...
- 论文《Network in Network》笔记
论文:Lin M, Chen Q, Yan S. Network In Network[J]. Computer Science, 2013. 参考:关于CNN中1×1卷积核和Network in N ...
- [二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)
1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct po ...