传送门

数据结构经典题。


首先考虑另外一种询问方式。

已知权值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)的更多相关文章

  1. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

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

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

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

  3. BZOJ2741:[FOTILE模拟赛]L

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

  4. 【bzoj2741】[FOTILE模拟赛] L

    Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...

  5. bzoj 2741 [FOTILE模拟赛] L

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

  6. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

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

  7. 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

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

  8. 2018.09.30 bzoj2821: 作诗(Poetize)(分块)

    传送门 分块经典题目. 先将数列分块. 然后预处理出每两个块之间有多少个数出现了正偶数次. 这样查询的时候对于中间的完整块直接用预处理出的数组搞定. 剩下的暴力枚举求解. 代码: #include&l ...

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

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

随机推荐

  1. leetcode263

    public class Solution { private bool Judge(int x) { ) { return false; } int bound = Convert.ToInt32( ...

  2. 5.log4j报错

    java.lang.UnsupportedClassVersionError: org/apache/log4j/Logger : Unsupported major.minor version 51 ...

  3. UI5-文档-4.5-Controllers

    在这个步骤中,我们将文本替换为一个按钮,并在按钮被按下时显示“Hello World”消息.按钮的按下事件的处理是在视图的控制器中实现的. Preview A Say Hello button is ...

  4. tair介绍以及配置

    简介 tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化两种使用方式. 非持久化的 tair 可以看成是一个分布式缓存. 持久化的 tair 将数据存 ...

  5. frame标签使用

    今天在做onebyone作业的时候,为了使自己的页面更加美观,我便使用了frame框架,百度了他的用法,总结如下 frame,是网页开发必须掌握的知识.例如后台架构.局部刷新,页面分割,都是frame ...

  6. textbox显示定位到最后一行(最新一行)

    this.textBox1.Select(this.txtMsgInfo.TextLength, 0); this.textBox1.ScrollToCaret();

  7. JFR 与 JProfilter Jvmisualvm

    只有JFR 是可以在生产环境使用  采用C++独立写的采样手机功能 而 JProfilter/JVisualvm 都只能在测试环境下使用 使用instrument 机制 ,还有debug 框架 最早是 ...

  8. Linux就业技术指导(七):游戏类运维重点流程解析

    一,某游戏公司例行上线与更新流程示例 例行维护/更新流程 1.1 更新前天 提前确认好要更新的是什么,更新会有人通知你,一般是运营人员 比如:我们明天做什么什么更新 1.2 第2天更新 一般固定点更新 ...

  9. tomcat 管理端 安全措施

    由于公司的项目并未启用nginx负载均衡,所以自然也没用到tomcat与web应用一对一的安全操作,经常会遇到 重启单个应用又不想重启tomcat的情况.同时,又出于安全考虑,将tomcat的默认管理 ...

  10. IllegalArgumentException: Could not resolve resource location pattern [classpath .xml]: class path resource cannot be resolved to URL because it does not exist

    查看编译后的classes文件后,没有mapper.xml文件,所以SQLsessionfactory不能读取成功. 在Maven中加入如下的resources配置: <dependencies ...