BZOJ2741: 【FOTILE模拟赛】L
2741: 【FOTILE模拟赛】L
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 1170 Solved: 303
[Submit][Status]
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
搬运题解: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的某一位,如果可以往相反方向走,就走,就可以了。。。
一些注释写在代码里
代码:
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<vector>
- #include<map>
- #include<set>
- #include<queue>
- #include<string>
- #define inf 1000000000
- #define maxn 150000+5
- #define maxm 5000000+5
- #define maxk 150
- #define eps 1e-10
- #define ll long long
- #define pa pair<int,int>
- #define for0(i,n) for(int i=0;i<=(n);i++)
- #define for1(i,n) for(int i=1;i<=(n);i++)
- #define for2(i,x,y) for(int i=(x);i<=(y);i++)
- #define for3(i,x,y) for(int i=(x);i>=(y);i--)
- #define mod 1000000007
- using namespace std;
- inline int read()
- {
- int x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
- return x*f;
- }
- int n,m,q,tot,rt[maxn],id[maxm],t[maxm][],a[maxn],b[maxk][maxn];
- inline void insert(int pre,int x,int k)
- {
- int now=rt[k]=++tot;id[tot]=k;
- for3(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];
- for3(i,,)
- {
- int j=((x>>i)&)^;
- if(id[t[now][j]]>=l)ans|=<<i;else j^=;//下面的节点的id都小于l,所以要改变方向
- now=t[now][j];
- }
- return ans;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- n=read();q=read();
- for1(i,n)a[i]=a[i-]^read();
- id[]=-;
- insert(rt[],a[],);//插入0
- for1(i,n)insert(rt[i-],a[i],i);//挨个插入前缀异或值
- int len=sqrt(n);m=n/len+(n%len!=);
- for0(i,m-)
- for2(j,i*len+,n)
- b[i][j]=max(b[i][j-],ask(i*len,j-,a[j]));//分块,用a[j]去查询在i*len-j-1的最大值
- int ans=;
- while(q--)
- {
- int x=((ll)read()+(ll)ans)%n+,y=((ll)read()+(ll)ans)%n+;
- if(x>y)swap(x,y);x--;
- int bx=x/len+(x%len!=);
- ans=bx*len<y?b[bx][y]:;//大块的答案已经得到
- for2(j,x,min(bx*len,y))
- ans=max(ans,ask(x,y,a[j]));//用小块内的点暴力查询max
- printf("%d\n",ans);
- }
- return ;
- }
BZOJ2741: 【FOTILE模拟赛】L的更多相关文章
- BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)
显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...
- BZOJ2741:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- 【BZOJ2741】【块状链表+可持久化trie】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]\)区间内的所有子区间 ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
- 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】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
随机推荐
- 09_httpclient测试SOAP协议
[工程截图]注意:无需使用Wsimport生成客户端代码 [HttpClient.java] import java.io.ByteArrayOutputStream; import java.io. ...
- OpenJudge/Poj 1661 帮助 Jimmy
1.链接地址: bailian.openjudge.cn/practice/1661 http://poj.org/problem?id=1661 2.题目: 总Time Limit: 1000ms ...
- 轻松解决fedora21装完NVIDIA显卡驱动后无法进入gnome问题
本来打算昨天写的,最近感冒了,打点滴,耽搁了! 我用的是联想14寸笔记本,装好了fedora21后,想装个NVIDIA显卡驱动试试,结果和很多人一样无法进入gnome界面,搞了三四个小时终于搞定.下面 ...
- mysql 之权限介绍
转自:http://tech.it168.com/a2010/0114/837/000000837456_all.shtml 一.MySQL授权表概述首先从全局开始,如果全局的是允许的,即在 user ...
- centos 端口开放及关闭
之前有讲过公司新买的服务器使用的是CentOS 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.因为以前部署在Win Ser ...
- MySQL基础学习之触发器
查看触发器 SHOW TRIGGER\G 创建触发器 CREATE TRIGGER 触发器名字 BEFORE/AFTER DELETE ON 表名 FOR EACH ROW INSERT INTO 表 ...
- TortoiseSVN文件夹及文件图标不显示解决方法 [转]
由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案 ...
- maven之ssh项目搭建
1:新建maven-archetupe-webapp项目 2:web.xml配置文件如下 <?xml version="1.0" encoding="UTF-8&q ...
- 如何让VS2012同时调试2个项目
- PL/SQL — BULK COLLECT用法
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...