BZOJ 2741 【FOTILE模拟赛】L(可持久化trie)
http://www.lydsy.com/JudgeOnline/problem.php?id=2741
思路:我们先将a变成a的异或前缀,这样问题就变成了,在l-1到r区间内,找出i,j令a[i]^a[j]最大。
假如i是固定的,我们可以建一个可持久化trie,在l-1到r区间内贪心寻找最优,但是这题i和j都不是固定的,如果暴力枚举i,那时间复杂度最坏是m*n*logn。
因此我们考虑这样:将n个数字分块,预处理出数组f[i][j],代表从第i块的开头作为左端点固定,j为右端点,这里面能产生的最优异或和,可以得到f[i][j]=max(f[i][j-1],query(root[start[i]-1],root[j],a[j])),这样转移,就能在接近O(n)的时间复杂度内预处理出数组,这样,对于m个询问中的每个l,r,假如l属于块i,那么我们先让ans=f[i+1][r],这样剩下我们只需要暴力解决l所属块i内的答案,这个求法就是上面说的固定点i,在root[l-1],root[r]区间内贪心查找,更新答案即可,还有这题,在强制在线的时候lastans+x和lastans+y可能会爆int。
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
int n,m,a[],b[],ch[][],sz,block_num,block_size,size[];
int f[][],root[];
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int &k,int kk,int v,int dep){
k=++sz;
size[k]=size[kk]+;
if (dep==-) return;
ch[k][]=ch[kk][],ch[k][]=ch[kk][];
if (v&(<<dep)) insert(ch[k][],ch[kk][],v,dep-);
else insert(ch[k][],ch[kk][],v,dep-);
}
int query(int x,int y,int v){
int res=;
for (int i=;i>=;i--){
int t=((v&(<<i))>);
if (size[ch[y][t^]]-size[ch[x][t^]]>){
res|=(<<i);
y=ch[y][t^];
x=ch[x][t^];
}else{
y=ch[y][t];
x=ch[x][t];
}
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
block_size=(int)sqrt(n);
block_num=n/block_size+(n%block_size!=);
for (int i=;i<=n;i++) {scanf("%d",&a[i]);a[i]^=a[i-];}
int ans=;
for (int i=;i<=n;i++) insert(root[i],root[i-],a[i],);
for (int i=;i<=block_num;i++)
for (int j=(i-)*block_size+;j<=n;j++){
f[i][j]=std::max(f[i][j-],query(root[(i-)*block_size],root[j],a[j]));
if (i==) f[i][j]=std::max(f[i][j],a[j]);
}
while (m--){
int x,y;
scanf("%d%d",&x,&y);
x%=n;y%=n;
x=(x+(ans%n))%n+;
y=(y+(ans%n))%n+;
if (x>y) std::swap(x,y);
x--;
int num=x/block_size+(x%block_size!=);
ans=;
int l=num*block_size+;
if (l<=y) ans=f[num+][y];
l=std::min(l,y);
for (int j=x;j<l;j++)
ans=std::max(ans,query(root[x],root[y],a[j]));
printf("%d\n",ans);
}
}
BZOJ 2741 【FOTILE模拟赛】L(可持久化trie)的更多相关文章
- 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树+分块
题目描述 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(分块+可持久化trie)
显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...
- 【bzoj2741】[FOTILE模拟赛] L
Portal --> bzoj2741 Solution 突然沉迷分块不能自拔 考虑用分块+可持久化trie来解决这个问题 对于每一块的块头\(L\),预处理\([L,i]\)区间内的所有子区间 ...
- BZOJ2741:[FOTILE模拟赛]L
Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...
- bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie
2741: [FOTILE模拟赛]L Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1116 Solved: 292[Submit][Status] ...
- 【BZOJ】【2741】【FOTILE模拟赛】L
可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
随机推荐
- UESTC 75 The Queen's New Necklaces
题意:一个项链的珠子的颜色有若干种.每种颜色的珠子个数为Ai.求有多少种不同的项链? 我们考虑,如果旋转i个珠子,那么会产生gcd(n,i)个循环节,每个循环节的大小我们假设为K,那么如果有一个颜色的 ...
- LeetCode_Palindrome Partitioning
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- redo、undo、binlog的区别
在MySQL中,redo.undo.binlog经常见,但很容易混淆这三者. redo undo binlog 作用 保持事务的持久性 帮助事务回滚及MVCC的功能 进行Point-In-Time ...
- [置顶] Android四大组件之BroadcastReceiver
Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...
- flexbox自动完成
1.引入文件 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" ty ...
- JSP SMARTUPLOAD组件:上传文件时同时获取表单参数
原因很简单: 注意更改from 属性啊!否则为null! 因为你用jspsmartuploadsmart时post请求 的格式是multipart/form-data,即enctype="m ...
- 四种简单的排序算法的php实现
无聊,用php写几个排序算法,算法介绍请移步这里,这里使用php实现了几个简单的,如下 //选择排序 function selection_sort($arr){ $len = count($arr) ...
- Java Fuck Bignumber
为了熟悉java , 开一套poj大数处理的题来写. ------------------------------------------------------------------- A: (1 ...
- 【POJ1005】I Think I Need a Houseboat
说是计算几何,其实是一道水题.直接算半圆面积即可. #include <iostream> #include <cstdlib> #include <cstdio> ...
- UVa10340.All in All
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...