Portal --> bzoj2741

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的更多相关文章

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

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

  2. BZOJ2741:[FOTILE模拟赛]L

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

  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. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

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

  6. bzoj 2741 [FOTILE模拟赛] L

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

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

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

  8. BZOJ2741: 【FOTILE模拟赛】L

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

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

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

随机推荐

  1. 【一】,python简单爬虫实现

    一: 1.获取当前页的课程名称,地址:https://www.ichunqiu.com/courses/webaq 2.选取其中一门课程名称查看源代码: 代码如下: <p class=" ...

  2. 【Alpha版本发布】爬虫队长正在待命!

    一.基础功能简介 本团队的爬虫能够从网上搜索相关内容, 并归类,把所爬到的网页或各种类型的文档下载到本地上. 上届团队Beta版本爬虫的主要功能如下: a)可爬取网页,问答页并进行问答文件分类. b) ...

  3. 奔跑吧DKY——团队Scrum冲刺阶段-Day 3

    今日完成任务 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需给出对应的调研总结博客链接:如果完成的任务为学习技术任务,需 ...

  4. Git的基本使用方法和安装&心得体会(使用git命令行)

    这是补发的,使用命令行操作的. (1)选择本地repository的路径 找到后点鼠标右键,选择git bash here. (2) clone到本地 在命令行输入 git clone ADDRESS ...

  5. 第一次spring冲刺第6天

    鉴于昨天的调查,今天做了个谈论,主要针对以下几个问题 1.我们的客户类型? 2.如何实现他们的需求? 3.他们真正想要什么? 4.如何保证他们的满足度? 5.怎么使得工程不陷入死循环? 6.还存在什么 ...

  6. 【DL.AI】《Structuring Machine Learning Projects》笔记

    一.改进模型的几个方法 Collect more data Collect more diverse training set Train algorithm longer with gradient ...

  7. iis托管管道模式-学习

    文章;IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员尤其有用,因为这样既可以令一台服务器 ...

  8. sql中exists和not exists的用法

    该文转载自:http://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是 ...

  9. debug阶段贡献分

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:11.29 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成 ...

  10. tomcat错误日志监控脚本

    #!/usr/bin/env python #-*-coding:utf-8-*- #CreateDate:2017/04/14 #Author:Eivll0m #ScriptName:monitor ...