2741: 【FOTILE模拟赛】L

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 1170  Solved: 303
[Submit][Status]

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范围内。

Source

题解:
搬运题解:by seter

分成长度为L的块,每块的第一个点叫做关键点,则总共有K=N/L个关键点。

处理出一个K*N的数组,表示每个关键点到之后每个点的答案。这个对于一个关键点是可以O(NlgN)弄出来的,用一般的trie就可以了,这个不会的话可以先去水水USACO再来。

然后对于一个询问(u,v),可以分解成(u,v)和(X,v),其中X是u之后的第一个关键点。

那么(X,v)已经处理出来了,剩下的就是u...X这O(L)个数在(u,v)中的max xor了。

问题转化为,求一段内与X的异或最大值。

这个东西用ChairTrie是可以随便减出来的。ChairTrie和ChairTree差不多,就是函数式Trie,从高到低处理X的某一位,如果可以往相反方向走,就走,就可以了。。。

一些注释写在代码里
代码:

  1. #include<cstdio>
  2.  
  3. #include<cstdlib>
  4.  
  5. #include<cmath>
  6.  
  7. #include<cstring>
  8.  
  9. #include<algorithm>
  10.  
  11. #include<iostream>
  12.  
  13. #include<vector>
  14.  
  15. #include<map>
  16.  
  17. #include<set>
  18.  
  19. #include<queue>
  20.  
  21. #include<string>
  22.  
  23. #define inf 1000000000
  24.  
  25. #define maxn 150000+5
  26.  
  27. #define maxm 5000000+5
  28. #define maxk 150
  29.  
  30. #define eps 1e-10
  31.  
  32. #define ll long long
  33.  
  34. #define pa pair<int,int>
  35.  
  36. #define for0(i,n) for(int i=0;i<=(n);i++)
  37.  
  38. #define for1(i,n) for(int i=1;i<=(n);i++)
  39.  
  40. #define for2(i,x,y) for(int i=(x);i<=(y);i++)
  41.  
  42. #define for3(i,x,y) for(int i=(x);i>=(y);i--)
  43.  
  44. #define mod 1000000007
  45.  
  46. using namespace std;
  47.  
  48. inline int read()
  49.  
  50. {
  51.  
  52. int x=,f=;char ch=getchar();
  53.  
  54. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  55.  
  56. while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
  57.  
  58. return x*f;
  59.  
  60. }
  61. int n,m,q,tot,rt[maxn],id[maxm],t[maxm][],a[maxn],b[maxk][maxn];
  62. inline void insert(int pre,int x,int k)
  63. {
  64. int now=rt[k]=++tot;id[tot]=k;
  65. for3(i,,)
  66. {
  67. int j=(x>>i)&;
  68. t[now][j^]=t[pre][j^];//空指针指向原来的
  69. t[now][j]=++tot;id[tot]=k;
  70. now=tot;
  71. pre=t[pre][j];
  72. }
  73. }
  74. inline int ask(int l,int r,int x)
  75. {
  76. int ans=,now=rt[r];
  77. for3(i,,)
  78. {
  79. int j=((x>>i)&)^;
  80. if(id[t[now][j]]>=l)ans|=<<i;else j^=;//下面的节点的id都小于l,所以要改变方向
  81. now=t[now][j];
  82. }
  83. return ans;
  84. }
  85.  
  86. int main()
  87.  
  88. {
  89.  
  90. freopen("input.txt","r",stdin);
  91.  
  92. freopen("output.txt","w",stdout);
  93.  
  94. n=read();q=read();
  95. for1(i,n)a[i]=a[i-]^read();
  96. id[]=-;
  97. insert(rt[],a[],);//插入0
  98. for1(i,n)insert(rt[i-],a[i],i);//挨个插入前缀异或值
  99. int len=sqrt(n);m=n/len+(n%len!=);
  100. for0(i,m-)
  101. for2(j,i*len+,n)
  102. b[i][j]=max(b[i][j-],ask(i*len,j-,a[j]));//分块,用a[j]去查询在i*len-j-1的最大值
  103. int ans=;
  104. while(q--)
  105. {
  106. int x=((ll)read()+(ll)ans)%n+,y=((ll)read()+(ll)ans)%n+;
  107. if(x>y)swap(x,y);x--;
  108. int bx=x/len+(x%len!=);
  109. ans=bx*len<y?b[bx][y]:;//大块的答案已经得到
  110. for2(j,x,min(bx*len,y))
  111. ans=max(ans,ask(x,y,a[j]));//用小块内的点暴力查询max
  112. printf("%d\n",ans);
  113. }
  114.  
  115. return ;
  116.  
  117. }

BZOJ2741: 【FOTILE模拟赛】L的更多相关文章

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

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

  2. BZOJ2741:[FOTILE模拟赛]L

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

  3. 【BZOJ2741】【块状链表+可持久化trie】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. 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块

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

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

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

  7. bzoj 2741 [FOTILE模拟赛] L

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

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

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

  9. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] ...

随机推荐

  1. 初学java,遇到的陌生词语(1)

    字节码文件:不包含硬件信息,完全与硬件平台无关,因此,无法直接由操作系统来运行. Java应用程序的执行过程:代码装入.代码检验.代码执行. 1.代码装入:由类装配器完成,装入程序运行时所需的所有源代 ...

  2. 3.MySQL之创建/删除用户

    登录mysql服务器后可使用grant命令来创建用户并赋予相关权限. mysql> use mysql; Reading table information for completion of ...

  3. el-get

    el-get Table of Contents 1. 依赖 2. 安装 3. 配置 3.1. 自定义包配置 4. 命令 5. 管理扩展 el-get 是一个emacs下的扩展管理工具.就像apt-g ...

  4. tail报错

    在block和index都没有满的情况下,有如下报错: tail -f messages tail:cannot watch 'messages' : No space left on device ...

  5. Web前端新人笔记之height、min-height的区别

     浏览器参照基准:Firefox, Chrome, Safari, Opera, IE: * IE6不支持CSS min-height属性.最小高度的定义:1. 元素拥有默认高度:2. 当内容超出元素 ...

  6. (转)web.config 为某个单独页面设置编码格式

    原文链接:http://www.cnblogs.com/mytechblog/articles/1937407.html 全站应用utf-8格式,在web.config里的<system.web ...

  7. gb2312编码提交url乱码解决

    gb2312编码提交url,服务器接收时出现乱码,用System.Web.HttpUtility.UrlDecode();解码 ,还是出现乱码,困老了我好长时间,终于在google上找到了解决办法. ...

  8. [C#]判断是否是合法的IP4,IP6地址

    判断一个字符串如果没有端口的话,利用IPAddress.TryParse很好判断,那么有端口怎么判断呢,正则表达式?还是其他方式? 关键代码: /// <summary> /// 判断是否 ...

  9. MongoDB入门三步曲3--部署技术:主备、副本集和数据分片

    mongodb部署--主备.副本及数据分片 主备复制 副本集 数据分片 主备复制 主备复制是最基本的一种多点部署方案,在读写分离.热备份.数据恢复等方面具有重要作用. 在真实的生产环境,主备库肯定需要 ...

  10. Boost 1.62.0 编译参数

    # Copyright Vladimir Prus 2002-2006.# Copyright Dave Abrahams 2005-2006.# Copyright Rene Rivera 2005 ...