bzoj 2741 【FOTILE模拟赛】L 分块 可持久化trie树
2016-10-21 11:26
330 查看
先处理一个前缀异或和,这样就从查询一段异或和最大的区间变成查询两个异或和最大的点。
然后处理一个可持久化trie,分块。
用可持久化trie预处理块内异或值最大的两个数,两块间异或值最大的两个数。
然后查询区间时对于整块的用块内和块间的最大值更新答案,对于其他的用可持久化trie求一下最大值。
设块大小为S,那么时间复杂度是这玩意:
O(n2Slog+M(n2S2+Slog))
然后处理一个可持久化trie,分块。
用可持久化trie预处理块内异或值最大的两个数,两块间异或值最大的两个数。
然后查询区间时对于整块的用块内和块间的最大值更新答案,对于其他的用可持久化trie求一下最大值。
设块大小为S,那么时间复杂度是这玩意:
O(n2Slog+M(n2S2+Slog))
#include <bits/stdc++.h> using namespace std; #define A 31 #define sz 120 #define N 12000 #define M 3100000 #define g(x) ((x-1)/sz+1) int n,Q,cnt; int a ,v ,v1[N/sz+10][N/sz+10],ans; int ch[M][2],num[M],root ; void insert(int pre,int &now,int v,int deep) { now=++cnt;num[now]=num[pre]+1; if(deep<0)return; ch[now][0]=ch[pre][0]; ch[now][1]=ch[pre][1]; int t=v>>deep&1; insert(ch[pre][t],ch[now][t],v,deep-1); } int query(int pre,int now,int v,int deep) { if(deep<0)return 0; int t=(v>>deep&1)^1; if(num[ch[now][t]]-num[ch[pre][t]]) return (1<<deep)+query(ch[pre][t],ch[now][t],v,deep-1); else return query(ch[pre][t^1],ch[now][t^1],v,deep-1); } int main() { //freopen("tt.in","r",stdin); scanf("%d%d",&n,&Q);n++; for(int i=2;i<=n;i++) scanf("%d",&a[i]),a[i]^=a[i-1]; for(int i=1;i<=n;i++) insert(root[i-1],root[i],a[i],A); for(int i=1;i<=n;i+=sz) for(int j=0;j<sz;j++) v[g(i)]=max(v[g(i)],query(root[i-1],root[i+sz-1],a[i+j],A)); for(int i=1;i<=n;i+=sz) for(int j=i+sz;j<=n;j+=sz) for(int k=0;k<sz;k++) v1[g(i)][g(j)]=max(v1[g(i)][g(j)],query(root[i-1],root[i+sz-1],a[j+k],A)); for(int l,r,x,y;Q--;) { scanf("%d%d",&x,&y); int t=n-1; x=(x%t+ans%t)%t+1,y=(y%t+ans%t)%t+1; l=min(x,y);r=max(x,y);r++; ans=0; if(g(l)==g(r)) { for(int i=l;i<=r;i++) ans=max(ans,query(root[l-1],root[r],a[i],A)); } else { int lp=g(l)+1,rp=g(r)-1; for(int i=lp;i<=rp;i++) ans=max(ans,v[i]); for(int i=lp;i<=rp;i++) for(int j=i+1;j<=rp;j++) ans=max(ans,v1[i][j]); lp=g(l)*sz;rp=(g(r)-1)*sz+1; for(int i=l;i<=lp;i++) ans=max(ans,query(root[l-1],root[r],a[i],A)); for(int i=rp;i<=r;i++) ans=max(ans,query(root[l-1],root[r],a[i],A)); } printf("%d\n",ans); } return 0; }
相关文章推荐
- [BZOJ2741]【FOTILE模拟赛】L(分块+可持久化trie树)
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
- BZOJ 2741 【FOTILE模拟赛】L 分块+可持久化Trie树
- bzoj2741: 【FOTILE模拟赛】L【可持久化trie树+分块】
- BZOJ 2741【FOTILE模拟赛】L 分块+可持久化Trie树
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
- bzoj 2741: 【FOTILE模拟赛】L (分块+可持久化trie树)
- [BZOJ2741][FOTILE模拟赛]L-可持久化字典树-分块
- BZOJ 2741: 【FOTILE模拟赛】L [分块 可持久化Trie]
- [BZOJ2741][[FOTILE模拟赛]][可持久化Trie+分块]
- 【BZOJ2741】【FOTILE模拟赛】L 可持久化字典树+分块
- [BZOJ 2741]【FOTILE模拟赛】L 分块+可持久trie树
- bzoj 2741 【FOTILE模拟赛】L 可持久化字典树+分块
- BZOJ2741 【FOTILE模拟赛】L 可持久化Trie+分块
- [BZOJ]2741: 【FOTILE模拟赛】L 可持久化Trie+分块
- [可持久化字典树 分块] BZOJ 2741 【FOTILE模拟赛】L
- BZOJ 2741 【FOTILE模拟赛】L 可持久化Trie 分块
- 【分块】【可持久化Trie】bzoj2741 【FOTILE模拟赛】L
- BZOJ - 2741: 【FOTILE模拟赛】L 分块+可持久化数据结构
- bzoj2741 FOTILE模拟赛L 可持久化Trie