【BZOJ】【2741】【FOTILE模拟赛】L
可持久化Trie+分块
神题……Orz zyf & lyd
首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问【某个区间中最大的区间异或和】改变成【某个区间中 max(两个数的异或和)】
要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了;然而我们并不能。
一个常见的折中方案:分块!
这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值。
我们不预处理所有的左端点,我们只预处理$\sqrt{n}$个左端点,与$n$个右端点的答案。
也就是说:将序列分成$\sqrt{n}$块,b[i][j]表示在块 i 的左端到位置 j 这个区间中,选出两个数,其最大的Xor值。
对于询问[l,r]:设p是$l$后面第一个块的左端点,[p,r]的答案已经在b[p][r]中,[l,p]的答案就是对[l,p]中每个数x执行ask(l,r,x);
最后:ask(l,r,x)用可持久化Trie实现:具体来说就是,如果能往1走就往1走,如果1这棵子树中所有点都是出现在$l$之前的,那么就往0走。
可持久化Trie的写法……根据可持久化线段树的写法,yy一下试试?其实差不多= =
/**************************************************************
Problem: 2741
User: Tunix
Language: C++
Result: Accepted
Time:6636 ms
Memory:148948 kb
****************************************************************/ //BZOJ 2741
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
typedef long long LL;
inline int getint(){
int r=,v=; char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-;
for(; isdigit(ch);ch=getchar()) v=v*-''+ch;
return r*v;
}
const int N=,M=5e6+;
/*******************template********************/ int n,m,q,tot,rt[N],id[M],t[M][],a[N],b[][N]; inline void Ins(int pre,int x,int k){
int now=rt[k]=++tot; id[tot]=k;
D(i,,){
int j=(x>>i)&;
t[now][j^]=t[pre][j^];
t[now][j]=++tot; id[tot]=k;
now=tot;
pre=t[pre][j];
}
}
inline int ask(int l,int r,int x){
int ans=,now=rt[r];
D(i,,){
int j=((x>>i)&)^;
if (id[t[now][j]]>=l) ans|=<<i; else j^=;
now=t[now][j];
}
return ans;
} int main(){
#ifndef ONLINE_JUDGE
freopen("2741.in","r",stdin);
freopen("2741.out","w",stdout);
#endif
n=getint(); q=getint();
F(i,,n) a[i]=a[i-]^getint();
id[]=-;
Ins(rt[],a[],);
F(i,,n) Ins(rt[i-],a[i],i);
int len=sqrt(n); m=n/len+(n%len!=);
rep(i,m) F(j,i*len+,n)
b[i][j]=max(b[i][j-],ask(i*len,j-,a[j]));
int ans=;
F(i,,q){
int x=((LL)ans+(LL)getint())%n+,y=((LL)ans+(LL)getint())%n+;
if (x>y) swap(x,y);
x--;
int bx=x/len+(x%len!=);
ans=bx*len < y ? b[bx][y] : ;
F(j,x,min(bx*len,y))
ans=max(ans,ask(x,y,a[j]));
printf("%d\n",ans);
}
return ;
}
2741: 【FOTILE模拟赛】L
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 1549 Solved: 413
[Submit][Status][Discuss]
Description
r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
Input
Output
Sample Input
1 4 3
0 1
0 1
4 3
Sample Output
7
7
HINT
HINT
N=12000,M=6000,x,y,Ai在signed longint范围内。
Source
【BZOJ】【2741】【FOTILE模拟赛】L的更多相关文章
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- bzoj 2741 [FOTILE模拟赛] L
Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...
- 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)
显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
- 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 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
- BZOJ2741: 【FOTILE模拟赛】L
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1170 Solved: 303[Submit][Status] ...
随机推荐
- CentOS 7.2 下 PXE+kickstart 自动安装系统
一.简单概述 1.1 Kickstart 概述 对于网络安装系统,在linux 下面最熟悉的应该就是 Kickstart 以及 cobbler.写这篇文章的目的在于我公司目前使用的就是 Kicksta ...
- HTTP上传大文件的节点配置
<system.web> <compilation debug="true" targetFramework="4.0" /> < ...
- Mybatis 源码分析之事物管理
Mybatis 提供了事物的顶层接口: public interface Transaction { /** * Retrieve inner database connection * @retur ...
- poj-1151矩形面积并-线段树
title: poj-1151矩形面积并-线段树 date: 2018-10-30 22:35:11 tags: acm 刷题 categoties: ACM-线段树 概述 线段树问题里的另一个问题, ...
- Bzoj5294/洛谷P4428 [Bjoi2018]二进制(线段树)
题面 Bzoj 洛谷 题解 考虑一个什么样的区间满足重组之后可以变成\(3\)的倍数.不妨设\(tot\)为一个区间内\(1\)的个数.如果\(tot\)是个偶数,则这个区间一定是\(3\)的倍数,接 ...
- JAVAEE——Solr:安装及配置、后台管理索引库、 使用SolrJ管理索引库、仿京东的电商搜索案例实现
1 学习回顾 1. Lucene 是Apache开源的全文检索的工具包 创建索引 查询索引 2. 遇到问题? 文件名 及文件内容 顺序扫描法 全文检索 3. 什么是全文检索? 这种先创建索引 再 ...
- 使用UniBeast安装Hackintosh(黑苹果)
前期准备 UniBeast 原版macOS Sierra安装包,由于苹果并没有提供完整dmg的下载地址,我也不在此提供,大家可以从信任的途径取得,文件后缀必须为dmg. 16GB或者更大的U盘 至少2 ...
- Python复数属性和方法操作实例
转自: https://blog.csdn.net/henni_719/article/details/56665254 #coding=utf8 ''' 复数是由一个实数和一个虚数组合构成,表示为: ...
- ARM 常用汇编指令
ARM 汇编程序的框架结构 .section .data <初始化的数据> .section.bss <未初始化的数据> .section .text .global _sta ...
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...