BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\)。即一个区间异或和可以转为求两个数的异或和。
那么对\([l,r]\)的询问即求\([l-1,r]\)中某两个数异或的最大值。
区间中某一个数和已知的一个数异或的最大值可以用可持久化Trie \(O(\log v)\)求出。所以尽量确定一个数,再在区间中求最大值。
而且数据范围提醒我们可以分块。
用\(head[i]\)表示第\(i\)块的开头位置,\(Max(l,r,x)\)表示\(x\)与\([l,r]\)中某一个数异或的最大值,\(f[i][j]\)表示从第\(i\)块的开始到位置\(j\),某两个数异或的最大值是多少。
那么 \(f[i][j] = \max(f[i-1][j-1], Max(head[i], j-1, A[j]))\)。可以在\(O(n\sqrt n\log v)\)时间内预处理。(\(A[]\)是前缀异或和)
查询的时候,设\(x\)表示\(l\)后面的第一块,若\(l,r\)在同一块里,则 \(ans = Max(l, r, A[i]), i\in[l,r]\)。(对啊 和自己异或也没什么意义)
否则 \(ans = \max(f[x][r], Max(l, r, A[i]))\),\(i\in[l,begin[x]-1]\)。
对\([1,r]\)的询问,可能会有同上一题一样的边界问题(可以异或0)?把\(A[0]=0\)也试一遍就行了。。
询问复杂度同样\(O(q\sqrt n\log v)\)。
//11020kb 8232ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 500000//为什么50000WA+TLE啊 QAQ
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define BIT 30
typedef long long LL;
const int N=12005,M=111;
int root[N],A[N],bel[N],H[N],f[M][N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Trie
{
#define S N*32
int tot,son[S][2],sz[S];
void Insert(int x,int y,int v)
{
for(int i=BIT; ~i; --i)
{
int c=v>>i&1;
son[x][c]=++tot, son[x][c^1]=son[y][c^1];
x=tot, y=son[y][c];
sz[x]=sz[y]+1;
}
}
int Query(int x,int y,int v)
{
int res=0;
for(int i=BIT; ~i; --i)
{
int c=(v>>i&1)^1;
if(sz[son[y][c]]-sz[son[x][c]]>0)
x=son[x][c], y=son[y][c], res|=1<<i;
else
c^=1, x=son[x][c], y=son[y][c];
}
return res;
}
}T;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
int n=read(),Q=read(),size=sqrt(n);
for(int i=1; i<=n; ++i)
bel[i]=(i-1)/size+1, T.Insert(root[i]=++T.tot,root[i-1],A[i]=A[i-1]^read());//^不是+ ==
H[1]=1;
for(int i=2,lim=bel[n]; i<=lim; ++i) H[i]=H[i-1]+size;
for(int i=1,lim=bel[n]; i<=lim; ++i)
for(int j=H[i]+1,rtl=root[H[i]-1]; j<=n; ++j)
f[i][j]=std::max(f[i][j-1],T.Query(rtl,root[j-1],A[j]));
for(int l,r,x,y,ans=0; Q--; )
{
x=((LL)read()+ans)%n+1, y=((LL)read()+ans)%n+1;//read()%n+ans%n 都可能爆int。。and LL要在括号里面。。
l=std::min(x,y), r=std::max(x,y);
--l, ans=0;
if(bel[l]==bel[r])
for(int i=l,rtl=root[std::max(0,l-1)],rtr=root[r]; i<=r; ++i)
ans=std::max(ans,T.Query(rtl,rtr,A[i]));
else
{
ans=f[bel[l]+1][r];
for(int i=l,lim=H[bel[l]+1]-1,rtl=root[std::max(0,l-1)],rtr=root[r]; i<=lim; ++i)
ans=std::max(ans,T.Query(rtl,rtr,A[i]));
}
printf("%d\n",ans);
}
return 0;
}
BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)的更多相关文章
- bzoj 2741 [FOTILE模拟赛] L
Description 多个询问l,r,求所有子区间异或和中最大是多少 强制在线 Solution 分块+可持久化trie 1.对于每块的左端点L,预处理出L到任意一个i,[L,j] 间所有子区间异或 ...
- 【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 [分块 可持久化Trie]
题意: 区间内最大连续异或和 5点调试到现在....人生无望 但总算A掉了 一开始想错可持久化trie的作用了...可持久化trie可以求一个数与一个数集(区间中的一个数)的最大异或和 做法比较明显, ...
- 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】【块状链表+可持久化trie】FOTILE模拟赛L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- BZOJ2741:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【BZOJ】【2741】【FOTILE模拟赛】L
可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...
随机推荐
- CSS3动画常用demo
1.border动画 2.闪动动画(一闪一闪亮晶晶,满天都是小星星) .blink { animation: mymove 0.8s infinite; -webkit-animation: mymo ...
- 在全志平台调试博通的wifi驱动(类似ap6212)【转】
转自:http://blog.csdn.net/fenzhi1988/article/details/44809779 调试驱动之前,首先先看看驱动代码,了解代码大致工作流程,再根据硬件配置驱动,比如 ...
- GPIO推挽输出和开漏输出详解
open-drain与push-pull] GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出.但是在配置GPIO管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽 ...
- nagios系列(八)之nagios通过nsclient监控windows主机
nagios通过nsclient监控windows主机 1.下载NSClient -0.3.8-Win32.rar安装在需要被监控的windows主机中 可以设置密码,此处密码留空 2.通过在nagi ...
- nagios监控客户端报错/usr/bin/perl^M: bad interpreter: No such file or directory
nagios服务端监控客户端内存时发现监控不上 在客户端直接执行脚本,报错如下: # /usr/local/nagios/libexec/check_memory.pl -w 6% -c 3% -ba ...
- 域名调整 SEO优化(nginx)
=============================================== 2019/3/31_第1次修改 ccb_warlock == ...
- es6 entries(),keys() 和 values()
for (let index of ['a', 'b'].keys()) { console.log(index); } // 0 for (let elem of ['a', 'b'].values ...
- vue-cli之webpack的proxyTable无效的解决方案
最近遇到这个需要单页访问跨域后台的问题 可以按照如下设置: proxyTable: { '/list': { target: 'http://api.xxxxxxxx.com', pathRewrit ...
- java多线程快速入门(六)
多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...
- linux ubuntu 指令
查找文件:ls -lrt /java 用于查找java文件信息 https://ipcmen.com/ls编辑/etc/profilewen文件,在文件末尾添加export JAVA_HOME=/us ...