BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)
显然做个前缀和之后变成询问区间内两个数异或最大值。
一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv)。
观察到数据范围很微妙。考虑瞎分块。
设f[i][j]为第i个块中的数和第j个数的异或最大值。显然建一棵可持久化trie就可以以O(n√nlogv)的复杂度搞出来。
有了这个后考虑怎么查询。对于完整的块内的数,给f再搞一个st表就可以了。而其他部分暴力枚举每个数,在可持久化trie上查询即可。
常数巨大。块大小改成√nlogn后在darkbzoj上差10ms就T了,bzoj上自然过不了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 12010
#define BLOCK 120
#define u(x,p) x>>p&1^1
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],f[BLOCK][N][],root[N],L[BLOCK],R[BLOCK],pos[N],lg2[N],cnt=,lastans,block;
struct data{int ch[],s;
}tree[N<<];
void ins(int &k,int x,int p)
{
tree[++cnt]=tree[k];k=cnt;tree[k].s++;
if (p<) return;
ins(tree[k].ch[x>>p&],x,p-);
}
int query(int l,int r,int x,int p)
{
if (p<) return ;
if (tree[tree[r].ch[u(x,p)]].s>tree[tree[l].ch[u(x,p)]].s)
return query(tree[l].ch[u(x,p)],tree[r].ch[u(x,p)],x,p-)+(<<p);
else query(tree[l].ch[x>>p&],tree[r].ch[x>>p&],x,p-);
}
void build()
{
for (int i=;i<=n;i++)
{
root[i]=root[i-];
ins(root[i],a[i],);
}
}
int query(int i,int x,int y)
{
return max(f[i][x][lg2[y-x+]],f[i][y-(<<lg2[y-x+])+][lg2[y-x+]]);
}
void divide()
{
lg2[]=;
for (int i=;i<=n;i++)
{
lg2[i]=lg2[i-];
if ((<<lg2[i])<=i) lg2[i]++;
}
block=sqrt(n*lg2[n]);block=min(max(block,),n);
for (int i=;i<=n/block;i++) L[i]=(i-)*block+,R[i]=i*block;
if (n%block) L[n/block+]=(n/block)*block+,R[n/block+]=n,block=n/block+;
else block=n/block;
for (int i=;i<=block;i++)
for (int j=L[i];j<=R[i];j++)
pos[j]=i;
for (int i=;i<=n;i++)
for (int j=;j<=block;j++)
f[j][i][]=query(root[L[j]-],root[R[j]],a[i],);
for (int i=;i<=block;i++)
for (int j=;j<;j++)
for (int k=;k<=n;k++)
f[i][k][j]=max(f[i][k][j-],f[i][min(n,k+(<<j-))][j-]);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2741.in","r",stdin);
freopen("bzoj2741.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read()+,m=read();
for (int i=;i<=n;i++) a[i]=a[i-]^read();
build();
divide();
for (int i=;i<=m;i++)
{
int x=((unsigned int)read()+lastans)%(n-)+,y=((unsigned int)read()+lastans)%(n-)+;
if (x>y) swap(x,y);y++;
lastans=;
for (int j=pos[x]+;j<pos[y];j++)
lastans=max(lastans,query(j,x,y));
if (pos[x]==pos[y])
{
for (int j=x;j<=y;j++)
lastans=max(lastans,query(root[x-],root[y],a[j],));
}
else
{
for (int j=x;j<L[pos[x]+];j++)
lastans=max(lastans,query(root[x-],root[y],a[j],));
for (int j=y;j>R[pos[y]-];j--)
lastans=max(lastans,query(root[x-],root[y],a[j],));
}
printf("%d\n",lastans);
}
return ;
}
BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)的更多相关文章
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- BZOJ2741:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
- 【bzoj2741】[FOTILE模拟赛] L
Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...
- bzoj 2741 [FOTILE模拟赛] L
Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- BZOJ 2741: 【FOTILE模拟赛】L [分块 可持久化Trie]
题意: 区间内最大连续异或和 5点调试到现在....人生无望 但总算A掉了 一开始想错可持久化trie的作用了...可持久化trie可以求一个数与一个数集(区间中的一个数)的最大异或和 做法比较明显, ...
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
随机推荐
- C#委托+回调详解
今天写不完,明天会接着写的,,,, 学习C#有一段时间了,不过C#的委托+回调才这两天才会用,以前只是知道怎么用.前面的一篇文章,函数指针,其实是为这个做铺垫的,说白了委托就相当于C语言中的函数指针, ...
- day69
昨日回顾: 1 路由层: 1简单配置 2无名分组 3有名分组 4反向解析--模板层,视图层 5路由分发 include 6名称空间 7伪静态 2 作业: urlpatterns = ...
- 【H5】直接拨打电话
一般<a href="tel:400-663-5999">400-663-5999</a>实现. 而形如<a href="tel:*9204 ...
- SAP调用RestfulApi接口接收数据
因为准备要做一个关于调用外部接口的需求,所以自己先练习一下. 程序说明:我已经在.net开发的系统里提供一个api接口,现在在sap访问这个接口,来接收数据. 这里涉及Restful Api知识,以后 ...
- 基于R语言的时间序列分析预测
数据来源: R语言自带 Nile 数据集(尼罗河流量) 分析工具:R-3.5.0 & Rstudio-1.1.453 #清理环境,加载包 rm(list=ls()) library(forec ...
- 20155209林虹宇逆向及Bof基础实验报告
20155209林虹宇逆向及Bof基础实验报告 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符 ...
- python3获取文件及文件夹大小
获取文件大小 os.path.getsize(file_path):file_path为文件路径 >>> import os >>> os.path.getsize ...
- [CF1017G]The Tree[树链剖分+线段树]
题意 给一棵一开始 \(n\) 个点全是白色的树,以 \(1\) 为根,支持三种操作: 1.将某一个点变黑,如果已经是黑色则该操作对所有儿子生效. 2.将一棵子树改成白色. 3.询问某个点的颜色. \ ...
- R实战 第八篇:重塑数据(reshape2)
数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...
- Js_实现3D球体旋转
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...