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] ...
随机推荐
- 二分法php
二分法.分别使用while循环的方法和递归调用的方法. <?php // 二分法的使用数组必须是有序的,或升序,或降序 $arr = array( 1, 3, 5, 7, 9, 13 ); // ...
- Linux系统扫描技术及安全防范
1.概述 一.主机扫描 二.路由扫描 三.批量服务扫描 四.linux防范恶意扫描安全策略 一个典型的网络安全事件 ·案例:通过网络扫描方式获取某运营商核心设备管理权限 step01:通过tracer ...
- Spring 整合Mybatis实例
演示样例下载地址:http://download.csdn.net/detail/geloin/4506640 本文基于Spring 注解,让Spring跑起来.本文使用Mysql数据库. (1) 导 ...
- Docker的Mysql数据库:把数据存储在本地目录
Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --n ...
- 福慧双修&探险 BZOJ4398&BZOJ2407
分析: 双倍经验(数据范围不同). 我们考虑,我们必定是从1走一条边到节点i,之后从i到j跑最短路,之后再从j到1走另一条边的情况下,不会重复,并且是答案.那么我们考虑预处理出pre[i]表示从1走到 ...
- [Baltic 2011]Lamp BZOJ2346
分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...
- 【LeetCode234】Palindrome Linked List★
题目描述: 解题思路: 判断一个单向链表是否是回文链表,并且要求O(n)的时间复杂度和O(1)的空间复杂度. 方法有以下几种: 1.遍历整个链表,将链表每个节点的值记录在数组中,再判断数组是不是一个回 ...
- WPF编程,通过Path类型制作沿路径运动的动画一种方法。
原文:WPF编程,通过Path类型制作沿路径运动的动画一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/de ...
- EJB开发第二期---开发具有本地接口的无状态Bean
一.EJB中的bean 1.1 EJB中bean分类 会话bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都 ...
- Ms.office2010安装教程
下面用到的软件下载地址如下:http://pan.baidu.com/s/1c08cxPI 第一步 1. 将压缩包office2010.rar解压解压后,会出现一个office2010文件夹如图1.1 ...