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] ...
随机推荐
- C语言的奇技
1.一个整型变量/字面值常量通常足够大,可以同时表示几个字符,所以有的C编译器允许字符常量/char及整型常量有多个字符.这表明当用' yes' 替代" yes" 时可能不会被发现 ...
- 谱曲软件-MuseScore
谱曲软件-MuseScore 参考: 1.MuseScore官网 2.免费乐谱制作软体MuseScore
- Microsoft Word Regular Expression
Microsoft Word Regular Expression Word裏的正則表達式-不一樣的符號. 一.Normal Find and Replace 二.Search by using wi ...
- JS 页面打印
var hkey_root, hkey_path, hkey_key hkey_root = "HKEY_CURRENT_USER" hkey_path = "\\Sof ...
- JavaScript 中的内存泄漏
JavaScript 中的内存泄漏 JavaScript 是一种垃圾收集式语言,这就是说,内存是根据对象的创建分配给该对象的,并会在没有对该对象的引用时由浏览器收回.JavaScript 的垃圾收集机 ...
- discuz 重新定义jquery的$
最近做个小插件 发现加了这个代码不执行: $.ajax({ url:'plugin.php?id=register:regeist_jiangsu', type:'post', data:{ 'mob ...
- PHP初学留神(五)·小结
来学习快两个月了,这周末即将回家开始写论文.那么走之前,好好总结一下这两个月的所学所得吧.这段时间,在实验室里做的Web开发主要涉及到了web开发的一些框架内容以及php基础知识.思维导图记录如下. ...
- C语言的数据类型
复习之余,做点笔记<C语言之数据类型> 一.整数数据类型 (1)整数数据类型 整数类型 char 字符型变量 1字节(8Bit) short 短整型 2字节(16Bit) i ...
- DB天气安卓客户端测试计划
分辨率 屏幕ppi 网络环境 操作系统 os 用户类型 地点 组合总数 其他 samsung htc 小米 ...
- 服务器环境搭建系列(四)-mysql篇
1.按照上一篇服务器环境搭建系列(三)-JDK篇中的方法检查系统是否已经预装Mysql并卸载. 2.下载mysql,这里是MySQL-server-5.5.25-1.linux2.6.x86_64.r ...