https://zybuluo.com/ysner/note/1238161

题面

给定一个初始长度为\(N\)的非负整数序列\(\{a\}\)。

有\(m\)个操作,操作分为两种:

  • 在序列末尾加一个数,\(++N\)

  • 给出\(l,r,x\),找出满足\(l\leq p\leq r\)的位置\(p\),最大化\(a_p\bigoplus a_{p+1}\bigoplus a_{p+2}\bigoplus...\bigoplus a_{N}\bigoplus x\)。

  • \(n\leq3*10^5,a_i\leq10^7\)

解析

维护区间最大异或和当然要召唤可持久化\(Trie\)树啦。

它的功能是,在完成建树后,能在给定一段区间和一个数的情况下得出它们异或得到的最大值

具体建立方法有点像把\(Trie\)树和主席树结合起来。

插入一个数(新建一棵树),枚举到某一位时,若这个数这一位是\(p\),则只用递归处理\(p\)子树,\(p\bigoplus1\)子树可以使用前面已有的对应子树。

对于询问,递归时若\(x\)这一位为\(p\),则把\(r\)树和\(l-1\)树对应子树(能贡献答案的)大小作差,若差为\(0\),说明区间中不存在该位为\(p\bigoplus1\)的数,答案该位为\(0\)。依此类推。

(其实看代码最清楚)

至于这个奇怪的询问方式,设异或前缀和为\(S\),则询问可视为\(S_N\bigoplus S_{p-1}\)。

注意数组\(rt,sum,t\)等数组大小要开到\(n*50\)左右。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#define re register
#define il inline
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int mod=1e9+7,N=3e7+100;
int n,m,tot,sum[N],t[N][2],rt[N],tim;
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il void Build(re int x,re int &y,re int w,re int d)
{
sum[y=++tim]=sum[x]+1;
if(d<0) return;
re int tmp=(w>>d)&1;
t[y][tmp^1]=t[x][tmp^1];
Build(t[x][tmp],t[y][tmp],w,d-1);
}
il int Query(re int x,re int y,re int w,re int d)
{
if(d<0) return 0;
re int tmp=(w>>d)&1,p=sum[t[y][tmp^1]]-sum[t[x][tmp^1]];
if(p>0) return (1<<d)+Query(t[x][tmp^1],t[y][tmp^1],w,d-1);
else return Query(t[x][tmp],t[y][tmp],w,d-1);
}
int main()
{
n=gi();m=gi();
Build(rt[0],rt[1],0,25);++n;
fp(i,2,n)
{
re int x=gi();tot^=x;
Build(rt[i-1],rt[i],tot,25);
}
while(m--)
{
re char s[5];scanf("%s",s);
if(s[0]=='A')
{
re int x=gi();tot^=x;
Build(rt[n],rt[n+1],tot,25);++n;
}
else
{
re int l=gi(),r=gi(),x=gi();
printf("%d\n",Query(rt[l-1],rt[r],tot^x,25));
}
}
return 0;
}

[luogu4735]最大异或和的更多相关文章

  1. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  2. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  3. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  4. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  5. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  6. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  7. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

  8. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

  9. 异或之(bzoj 3689)

    Description 给定n个非负整数A[1], A[2], --, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这 ...

随机推荐

  1. ThinkPHP---框架介绍

    (1)什么是框架? ①框架是一堆包含了常量.方法和类等代码集合: ②半成品应用,只包含了项目开发时的底层架构,并不包含业务逻辑: ③包含一些设计模式,例如单例模式,工厂模式,AR(Active Rec ...

  2. you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varchar(255), sort integer not null

    you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...

  3. Java基础——工具类

    一Java 常用类 Object Object类是所有类.数组.枚举类的父类.位于Java.lang包.也就是说,Java允许把任意类型的对象赋给Object类型的变量. Object类的常用方法 1 ...

  4. vivo手机执行input命令提示killed

    异常现象: 使用vivo手机时发现通过inputManager发送按键.执行屏幕滑动等动作失效,相关API并没有任何异常抛出,继续跟踪发现shell控制台执行input进行屏幕滑动.发送文本.模拟按键 ...

  5. [C++] 化学方程式的格式化算法

    网上普遍使用的化学方程式的格式普遍如下 例: KMnO4+FeSO4+H2SO4=Fe2(SO4)3+MnSO4+K2SO4+H2O 要把化学方程式格式化,单单一个正则表达式是非常反人类的,故可选用 ...

  6. (二)Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用

    #!usr/bin/env python # -*- coding: utf-8 -*- def test(): print('hello, world') if __name__ == " ...

  7. 移动端禁止滑动的js处理方式

    下面是禁止移动端滑动事件的方式,慎用  document.querySelector('body').addEventListener('touchmove', function (ev) {     ...

  8. [bzoj3671][Noi2014][随机数生成器] (贪心+位运算+卡空间)

    Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...

  9. hdu 2167 状态压缩dp

    /* 状态转移方程:dp[i][j]=Max(dp[i][j],dp[i-1][k]+sum[i][j]); */ #include<stdio.h> #include<string ...

  10. 如何取消codeblocks对msvcr100.dll的依赖?

    用VS2010或是codeblocks开发的程序,在开发之外的机器上,可能会提前缺少msvcr100.dll之类的文件. 可以用如何设置,取消其对库文件的依赖. 当然,还要注意创建程序的类型.(补) ...