【BZOJ2741】【FOTILE模拟赛】L

Description

FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和。
即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r。
为了体现在线操作,对于一个询问(x,y):
l = min ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
r = max ( ((x+lastans) mod N)+1 , ((y+lastans) mod N)+1 ).
其中lastans是上次询问的答案,一开始为0。

Input

第一行两个整数N和M。
第二行有N个正整数,其中第i个数为Ai,有多余空格。
后M行每行两个数x,y表示一对询问。

Output

共M行,第i行一个正整数表示第i个询问的结果。

Sample Input

3 3
1 4 3
0 1
0 1
4 3

Sample Output

5
7
7

HINT

HINT

N=12000,M=6000,x,y,Ai在signed longint范围内。

题解:分块还是练脑子啊~

[a,b]最大连续xor和=[a-1,b]中任意两个前缀xor和 的xor的最大值(就是求出前缀xor和数组s,找出a-1<=i<j<=b使得s[i]^s[j]最大)。

我们先枚举每个块的左端点i,然后枚举i右面的所有的j,求出[i,j]中任意两个前缀xor和的xor的最大值,这个可以用可持久化Trie树实现。那么对于询问[a,b],我们已经处理完了[k*block,b]的答案,现在我们只需求出[a,k*block)中的答案。枚举然后一个一个在可持久化Trie树上找就行了。

一开始写着写着都快疯了,对拍时小数据全过,一到大数据就GG,最后不得已照着题解码一遍还是GG,最后发现数组开小了~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=12010;
typedef long long ll;
int n,m,B,tot;
int rt[maxn];
int ans;
int v[maxn],s[maxn],f[120][maxn];
struct Trie
{
int siz,ch[2];
}tr[750000];
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void insert(int x,int y,int num)
{
int i,d;
rt[y]=++tot,y=rt[y];
for(i=1<<30;i;i>>=1)
{
d=((num&i)>0);
tr[y].ch[d]=++tot,tr[y].ch[d^1]=tr[x].ch[d^1];
y=tr[y].ch[d],x=tr[x].ch[d],tr[y].siz=tr[x].siz+1;
}
}
int query(int x,int y,int num)
{
int i,ret=0,d;
x=(x<0)?0:rt[x],y=(y<0)?0:rt[y];
for(i=1<<30;i;i>>=1)
{
d=!(num&i);
if((tr[tr[y].ch[d]].siz-tr[tr[x].ch[d]].siz)>0) ret|=i;
else d^=1;
y=tr[y].ch[d],x=tr[x].ch[d];
}
return ret;
}
int main()
{
//freopen("bz2741.in","r",stdin);
//freopen("bz2741.out","w",stdout);
n=rd(),m=rd();
int i,j,c,d,a,b;
insert(0,rt[0],0);
for(i=1;i<=n;i++) v[i]=rd(),s[i]=s[i-1]^v[i],insert(rt[i-1],i,s[i]);
B=int(sqrt(double(n)));
for(i=0;i*B<=n;i++) for(j=i*B;j<=n;j++) f[i][j]=max(query(i*B-1,j,s[j]),j?f[i][j-1]:0);
for(i=1;i<=m;i++)
{
a=((ll)rd()+ans)%n+1,b=((ll)rd()+ans)%n+1,ans=0;
if(a>b) swap(a,b);
a--,c=a/B+1,ans=f[c][b];
for(j=min(c*B-1,b);j>=a;j--) ans=max(ans,query(a-1,b,s[j]));
printf("%d\n",ans);
}
return 0;
}

【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树的更多相关文章

  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 可持久化Trie树+分块

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

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

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

  6. bzoj 2741 [FOTILE模拟赛] L

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

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

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

  8. BZOJ 2741: 【FOTILE模拟赛】L [分块 可持久化Trie]

    题意: 区间内最大连续异或和 5点调试到现在....人生无望 但总算A掉了 一开始想错可持久化trie的作用了...可持久化trie可以求一个数与一个数集(区间中的一个数)的最大异或和 做法比较明显, ...

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

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

随机推荐

  1. ES6里关于字符串的拓展

    一.子串识别 自从 JS 引入了 indexOf() 方法,开发者们就使用它来识别字符串是否存在于其它字符串中.ES6 包含了以下三个方法来满足这类需求: 1.includes():该方法在给定文本存 ...

  2. awk使用记录

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  3. 转: 初识Agile/CMMI/Scrum

    转:http://www.cnblogs.com/maxwell/p/5093917.html 一.背景介绍 在朋友(aehyok)的建议下,初步去了解Visual Studio Online,简称V ...

  4. EffectiveJava(7)避免使用终结方法

    避免使用终结方法 1.使用终结方法会导致行为不稳定,性能降低,以及可移植性的问题.(终结线程的优先级过低) 终结方法不能保证被及时的执行(从一个对象变得不可到达开始,到中介方法被执行,所花费的时间是任 ...

  5. HTML5 Canvas 画钟表

    画钟表是2D画图的老生常谈,我也不能免俗弄了一个.代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta ht ...

  6. JAVA Eclipse如何重新设置工作空间workspace

    窗口-首选项-常规-启动和关闭,勾选启动时提示工作空间,然后移除现有的工作空间,最好也勾选启动时刷新工作空间   重启之后就可以设置工作空间了  

  7. Swif语法基础 要点归纳(一)

    常量和变量 用let声明常量      let m = 20 用var声明变量      var n = 0 类型推导机制           声明常量或变量时.能够不指定常量/变量类型,编译器会依据 ...

  8. [译] ContentEditable 那些好的、坏的和坑

    译者注 我的上一篇译文 “[译] 通过 contentEditable 属性创建一个所见即所得的编辑器” 的原文 “Create a WYSIWYG Editor With the contentEd ...

  9. 02-2设置第一启动项--进入Bios界面设置U盘为第一启动项

    进入Bios界面设置U盘为第一启动项: 开机,当电脑处于启动状态,屏幕显示电脑LOGO时,按下F2键.(根据电脑的不同,进入BIOS的功能键也不同,可根据自己电脑的型号百度搜索相关功能键) 按电脑方向 ...

  10. Socket 异步通信示例

    这个项目是一个控制台应用程序: 服务器端: using System; using System.Net; using System.Net.Sockets; using System.Text; u ...