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] ...
随机推荐
- bzoj2287:[POJ Challenge]消失之物
思路:首先先背包预处理出f[x]表示所有物品背出体积为x的方案数.然后统计答案,利用dp. C[i][j]表示不用物品i,组成体积j的方案数. 转移公式:C[i][j]=f[j]-C[i][j-w[i ...
- JAVA 修改 JSESSIONID
@Action("sidTest") public void sidTest() { HttpSession session = request.getSession(); Str ...
- HTML5-原声拖放
最早在网页中引入js拖放功能的是IE4,并且只可以拖放图像和某些文本.IE5.5以后网页中的任何元素都可以进行拖放.HTML5以IE为实例制定了拖放规范.FireFox3.5.Safari3+和Chr ...
- 谈谈GUI的配色和字体选择
对于工控领域的显示屏,显示效果很难和电脑屏幕相比.电脑上操作系统或者各种软件的配色方案,在应用到工业控制屏上就会出现“完全不是所想要”的结果,所以工控领域GUI的色彩.字体的选择还是有特别的讲究. 配 ...
- 6.MVC框架开发(文件上传)
1.需要设置表单的enctype="multipart/form-data"属性 2.在控制器中获取表单文件中数据 [HttpPost] public ActionResult A ...
- asp.net mvc NPOI 生成Excel文件
private string PushToDown(string addtime) { DataTable dt = _bCreateCode.PushtoExcel(addtime); //1.实例 ...
- Java内存管理:深入Java内存区域
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 概述: 对于从事C和C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的皇帝 ...
- CSS随手记
html5模板 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- [转载]用c写PHP的扩展接口(php5,c++)
原文[http://bugs.tutorbuddy.com/php5cpp/php5cpp/] 第1节. 开始之前 开始前,我要说明:这篇文章所描述的主要是在UNIX的PHP环境上的. 另外一点我要说 ...
- Unity3D热更新
原地址:http://crazylights.cnblogs.com/ 下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统 ...