2018.09.30 bzoj2741: 【FOTILE模拟赛】L(分块+可持久化01trie)
传送门
数据结构经典题。
首先考虑另外一种询问方式。
已知权值val,在区间[1,n][1,n][1,n]中找一个数使得valvalval^a[i]a[i]a[i]最大。
这个可以直接01trie。
那么变成区间[l,r][l,r][l,r]之后显然可以用可持久化01trie。
但是现在不知道权值val。
所以我们用分块预处理把时间复杂度变成O(n∗sqrt(n)∗logn)O(n*sqrt(n)*logn)O(n∗sqrt(n)∗logn)的。
具体来说就是mx[i][j]mx[i][j]mx[i][j]表示从第i块开头开始到j这段区间最大的两个数的异或和。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 12005
#define P 60
using namespace std;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,m,sig,rt[N],blo[N];
ll lastans=0,mx[150][N],sum[N];
struct Trie{
int son[N*400][2],siz[N*400],tot;
inline int insert(ll val,int las){
int p,ret;
p=ret=++tot;
for(int i=P;~i;--i){
son[p][0]=son[las][0],son[p][1]=son[las][1],siz[p]=siz[las]+1;
ll tmp=(val>>i)&1ll;
son[p][tmp]=++tot,p=son[p][tmp],las=son[las][tmp];
}
siz[p]=siz[las]+1;
return ret;
}
inline ll query(int l,int r,ll val){
ll ret=0;
for(int i=P;~i;--i){
ll tmp=(val>>i)&1ll;
if(siz[son[r][tmp^1ll]]-siz[son[l][tmp^1ll]])ret|=1ll<<i,l=son[l][tmp^1ll],r=son[r][tmp^1ll];
else l=son[l][tmp],r=son[r][tmp];
}
return ret;
}
}T;
int main(){
n=read(),m=read(),sig=sqrt(n),T.tot=0;
for(int i=1;i<=n;++i)blo[i]=(i-1)/sig+1,rt[i]=T.insert((sum[i]=sum[i-1]^read()),rt[i-1]);
for(int i=1;i<=blo[n];++i){
ll tmp=0;
for(int j=(i-1)*sig+1;j<=n;++j)tmp=max(tmp,T.query(rt[(i-1)*sig-1],rt[j],sum[j])),mx[i][j]=tmp;
}
while(m--){
int l=(read()+lastans)%n+1,r=(read()+lastans)%n+1;
if(l>r)swap(l,r);
lastans=(blo[l]^blo[r])?mx[blo[l]+1][r]:0;
int ql=l-1,qr=min(r,blo[l]*sig);
for(int i=ql;i<=qr;++i)lastans=max(lastans,T.query(rt[l-2],rt[r],sum[i]));
printf("%lld\n",lastans);
}
return 0;
}
2018.09.30 bzoj2741: 【FOTILE模拟赛】L(分块+可持久化01trie)的更多相关文章
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- 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】[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 .. ...
- 2018.09.30 bzoj2821: 作诗(Poetize)(分块)
传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
随机推荐
- leetcode349
public class Solution { public int[] Intersection(int[] nums1, int[] nums2) { var list1 = nums1.ToLi ...
- shiro 与spring的集成
1.导入spring与shiro的jar包 2.在web.xml 文件中配置shiro的shiroFilter <filter> <filter-name>shiroFilte ...
- myeclipse 代码提示
from http://fuyiyuan2011.iteye.com/blog/1258264 在软件开发过程中,有了代码提示能使开发能够更加快捷与便利.但在Eclipse ,MyEclipse等ja ...
- 揭秘Java架构技术体系
Web应用,最常见的研发语言是Java和PHP. 后端服务,最常见的研发语言是Java和C/C++. 大数据,最常见的研发语言是Java和Python. 可以说,Java是现阶段中国互联网公司中,覆盖 ...
- word自动生成章节标题
一级目录 二级目录 三级标题
- Posting JSON to Spring MVC Controller
Spring MVC can be setup to automatically bind incoming JSON string into a Java object. Firstly, ensu ...
- Python内存管理机制及优化简析(转载)
from:http://kkpattern.github.io/2015/06/20/python-memory-optimization-zh.html 准备工作 为了方便解释Python的内存管理 ...
- SOA和微服务到底是什么关系
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p/5847441.html SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上 ...
- 通过IP地址进行精准定位
可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,如下图: 当我们想具体到街道甚至门牌号,该怎么办??? 偶然间发现百度地图有高精度IP定位API的接口,通过该接 ...
- Delphi 创建一个url网址快捷方式代码
procedure CreateURLShortcut(const ShortcutFile, URL: string); var F: TextFile; // text file begin {$ ...