BZOJ 2741 L (可持久化01Trie+分块)
题目大意:给你一个序列,共有$q$个询问,每次询问区间$[L,R]$内最大连续字段异或和,强制在线,$n<=12000,m<=5000$
有个细节没处理好$WA$了好久..还有一次$ans$没清零
先对序列建出可持久化$01Trie$
分块预处理出,任意两块所覆盖区域的最大$xor$和,枚举右侧块内的每个数,然后在$01Trie$里查找即可,预处理总时间$O(n \sqrt n)$
对于每次询问,中间部分的答案可以$O(1)$得到
边界情况,左侧不完整块内的每个数都要分别作为区间左端点和右端点在$01Trie$里查找最大值
右侧不完整块内的每个数作为区间右端点在01Trie里查找最大值即可,因为一旦出现它作为左端点的情况,它右面的数一定会作为右端点查询到它
时间$O(q\sqrt n+n\sqrt n)$
数据还挺强的
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 12100
#define N2 420100
#define M1 120
#define ll long long
#define dd double
#define uint unsigned int
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
} int n,m,sq,tq;
uint bin[]; struct Trie{
int ch[N2][],num[N2],root[N1],tot;
void build()
{
root[]=tot=;int x=;
for(int i=;i>=;i--){
ch[x][]=++tot;
x=ch[x][],num[x]=;
}
}
void insert(uint s,int rt1,int rt2,int w)
{
int x,y,p;
y=root[rt1];
x=root[rt2]=++tot;
for(int i=;i>=;i--){
p=(s&bin[i])?:;
ch[x][p]=++tot;
ch[x][p^]=ch[y][p^];
num[ch[x][p]]=num[ch[y][p]]+w;
x=ch[x][p],y=ch[y][p];
}
}
uint query(uint s,int l,int r)
{
int x,y,p;uint ans=;
x=root[r];
y=l<?:root[l];
for(int i=;i>=;i--){
p=(s&bin[i])?:;
if(num[ch[x][p^]]-num[ch[y][p^]]>){
x=ch[x][p^],y=ch[y][p^];
ans|=bin[i];
}else if(num[ch[x][p]]-num[ch[y][p]]>){
x=ch[x][p],y=ch[y][p];
}else break;
}return ans;
}
}T; uint a[N1],pa[N1];
uint s1[M1][M1];
int L[M1],R[M1]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=;i++)
bin[i]=(<<i);
int x,y;
T.build();
for(int i=;i<=n;i++)
{
a[i]=gint();
pa[i]=pa[i-]^a[i];
T.insert(pa[i],i-,i,);
}
sq=sqrt(n);tq=n/sq;
for(int i=;i<=tq+;i++)
L[i]=(i-)*sq+,R[i]=min(n,i*sq);
for(int i=;i<=tq;i++)
for(int j=i;j<=tq;j++)
{
s1[i][j]=s1[i][j-];
for(int k=L[j];k<=R[j];k++)
s1[i][j]=max(s1[i][j],T.query(pa[k],L[i]-,k-));
}
uint ans=;int px,py;
for(int j=;j<=m;j++)
{
x=gint(),y=gint();
x=(ans+x)%n+,y=(ans+y)%n+;
if(x>y) swap(x,y);
px=(x-)/sq+,py=(y-)/sq+;
if(px!=py){
ans=s1[px+][py-];
for(int i=x;i<=R[px];i++)
ans=max(ans,T.query(pa[i],x-,i-));
for(int i=x-;i<=R[px]-;i++)
ans=max(ans,T.query(pa[i],i,y));
for(int i=L[py];i<=y;i++)
ans=max(ans,T.query(pa[i],x-,i-));
}else{
ans=;
for(int i=x;i<=y;i++)
ans=max(ans,T.query(pa[i],x-,i-));
}
printf("%u\n",ans);
}
return ;
}
BZOJ 2741 L (可持久化01Trie+分块)的更多相关文章
- BZOJ 2741: 【FOTILE模拟赛】L(可持久化Trie+分块)
传送门 解题思路 首先求出前缀异或和,那么问题就转化成了区间内选两个数使得其异或和最大.数据范围不是很大考虑分块,设\(f[x][i]\)表示第\(x\)块开头到\(i\)这个位置与\(a[i]\)异 ...
- 2018.09.30 bzoj2741: 【FOTILE模拟赛】L(分块+可持久化01trie)
传送门 数据结构经典题. 首先考虑另外一种询问方式. 已知权值val,在区间[1,n][1,n][1,n]中找一个数使得valvalval^a[i]a[i]a[i]最大. 这个可以直接01trie. ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...
- BZOJ 3689 异或之 (可持久化01Trie+堆)
题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;a ...
- BZOJ 3261 最大异或和 (可持久化01Trie)
题目大意:让你维护一个序列,支持在序列末插入一个数,支持询问$[l,r]$区间内选择一个位置$p$,使$xor\sum_{i=p}^{n}a_{i}$最大 可持久化$01Trie$裸题,把 区间异或和 ...
- ⌈洛谷4735⌋⌈BZOJ3261⌋最大异或和【可持久化01Trie】
题目链接 [BZOJ传送门] [洛谷传送门] 题解 终于学会了可持久化trie树了.感觉并不是特别的难. 因为可持久化,那么我们就考虑动态开点的trie树. 都知道异或操作是有传递性的,那么我们就维护 ...
- BZOJ 3744 Gty的妹子序列 (分块+树状数组+主席树)
题面传送门 题目大意:给你一个序列,多次询问,每次取出一段连续的子序列$[l,r]$,询问这段子序列的逆序对个数,强制在线 很熟悉的分块套路啊,和很多可持久化01Trie的题目类似,用分块预处理出贡献 ...
- 2019.01.13 bzoj4137: [FJOI2015]火星商店问题(线段树分治+可持久化01trie)
传送门 题意:序列上有nnn个商店,有两种事件会发生: sss商店上进购标价为vvv的一个物品 求编号为[l,r][l,r][l,r]之间的位置买ddd天内新进购的所有物品与一个数xxx异或值的最大值 ...
随机推荐
- [Atcoder Code Festival 2017 Qual B Problem F]Largest Smallest Cyclic Shift
题目大意:给你\(A\)个a,\(B\)个b,\(C\)个c,要你构造一个字符串,使它的最小循环表示法最大.求这个表示法.解题思路:不知道怎么证,但把a.b.c当做单独的字符串扔进容器,每次把字典序最 ...
- python3编写登录接口
#/usr/bin/env python#yehui'''作业一:博客 作业二:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定'''import getpass, os, pic ...
- .net 参数修饰符
参数修饰符的作用 参数修饰符 作用 无 如果一个参数没有用参数修饰符标记,则认为它将按值传递(pass by value),这意味着被调用的方法收到原始数据的一份副本 out 输出参数由被调用的方法赋 ...
- HDU 4418 高斯消元法求概率DP
把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...
- sqlite学习笔记9:C语言中使用sqlite之插入数据
前面创建了一张表,如今给他插入一些数据.插入数据跟创建表差点儿相同,不过SQL语言不一样而已,完整代码例如以下: #include <stdio.h> #include <stdli ...
- Making ViewState More Secure
Unencrypted view state in ASP.NET 2.0 could leak sensitive information https://www.rapid7.com/db/vul ...
- m_Orchestrate learning system---九、在无法保证是否有图片的情况下,如何保证页面格式
m_Orchestrate learning system---九.在无法保证是否有图片的情况下,如何保证页面格式 一.总结 一句话总结:都配上默认缩略图就可以解决了 1.如何获取页面get方式传过来 ...
- DGA ngram kmeans+TSNE用于绘图
# -*- coding:utf-8 -*- import sys import re import numpy as np from sklearn.externals import joblib ...
- rails数据库操作rake db一点心得
问题描述,对于很多的新手rails lover来说,搞定db是件头疼的事情,当建立了一个model,测试了半天发现我草列名写错了,再过一会儿发现association里面竟然没有xxx_id,这下子s ...
- vue keep-alive保存路由状态1 (接下篇)
本文很长,但是很详细,请耐心看完就一目了然了有下篇 keep-alive 是 Vue 内置的一个组件,使被包含的组件保留状态,或避免重新渲染. 1. 基础用法,缓存所有路由: <keep-ali ...