luogu P4735 最大异或和
背景:
hehe...hehe...hehe...
题目传送门:
https://www.luogu.org/problemnew/show/P4735
题意:
一个序列,支持两种操作加入一个元素xxx或给出l,r,xl,r,xl,r,x,询问在[l,r][l,r][l,r]中找到一个点ppp,使得ap⊕ap+1⊕ap+2⊕...⊕an⊕xa_p⊕a_{p+1}⊕a_{p+2}⊕...⊕a_{n}⊕xap⊕ap+1⊕ap+2⊕...⊕an⊕x最大,求这个的最大值。
思路:
back to summary\text{back to summary}back to summary.
异或的解决方法一般有线性基和01Trie\text{01Trie}01Trie。
这是一道动态的问题,需要动态的方式,当然是动态01Trie\text{01Trie}01Trie,即可持久化01Trie\text{01Trie}01Trie。
其实我们知道可持久化线段树(一种实现方式是主席树),运用类似的思想构建一棵可持久化01Trie\text{01Trie}01Trie。
我们可以求出异或前缀preipre_iprei。
ap⊕ap+1⊕ap+2⊕...⊕an⊕xa_p⊕a_{p+1}⊕a_{p+2}⊕...⊕a_{n}⊕xap⊕ap+1⊕ap+2⊕...⊕an⊕x
=prep−1⊕pren⊕x=pre_{p-1}⊕pre_{n}⊕x=prep−1⊕pren⊕x
=prep−1⊕(pren⊕x)=pre_{p-1}⊕(pre_{n}⊕x)=prep−1⊕(pren⊕x)
而pren⊕xpre_{n}⊕xpren⊕x是已知的,不妨设为SSS。
我们就转化成求S⊕prep−1S⊕pre_{p-1}S⊕prep−1的最大值,其中p∈[l,r]p∈[l,r]p∈[l,r]。
这等价于求S⊕prepS⊕pre_{p}S⊕prep的最大值,其中p∈[l−1,r−1]p∈[l-1,r-1]p∈[l−1,r−1]。
注意一下l=1l=1l=1(即l−1=0l-1=0l−1=0)时要特判一下。
还是递归版比较和谐。
over.\text{over.}over.
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int root[20000000],tot[20000000],pre[600010];int tr[20000000][2];int n,m,len=0;
void insert(int now,int last,int t,int x)
{if(t<0) return;int tmp=(x>>t)&1;tr[now][tmp]=++len;tr[now][tmp^1]=tr[last][tmp^1];tot[tr[now][tmp]]=tot[tr[last][tmp]]+1;insert(tr[now][tmp],tr[last][tmp],t-1,x);
}
int query(int now,int last,int t,int x)
{if(t<0) return 0;int tmp=(x>>t)&1;if(tot[tr[now][tmp^1]]<tot[tr[last][tmp^1]]) return (1<<t)|query(tr[now][tmp^1],tr[last][tmp^1],t-1,x); else return query(tr[now][tmp],tr[last][tmp],t-1,x);
}
int main()
{int l,r,x;char s[5];scanf("%d %d",&n,&m);root[0]=++len;insert(root[0],0,25,0);for(int i=1;i<=n;i++){scanf("%d",&x);pre[i]=pre[i-1]^x;root[i]=++len;insert(root[i],root[i-1],25,pre[i]);}for(int i=1;i<=m;i++){scanf("%s",s+1);if(s[1]=='A'){scanf("%d",&x);n++;pre[n]=pre[n-1]^x;root[n]=++len;insert(root[n],root[n-1],25,pre[n]);}else{scanf("%d %d %d",&l,&r,&x);l--,r--;printf("%d\n",query(!l?0:root[l-1],root[r],25,x^pre[n]));}}
}
luogu P4735 最大异或和相关推荐
- [luogu] P4735 最大异或和
link 先是转化题意. 因为在后面加入数,动态维护后缀 xor\text{xor}xor 明显麻烦,于是考虑转化成前缀和. 设 S[i]=S[i−1]⊕A[i]S[i]=S[i-1] ⊕ A[i]S ...
- P4735 最大异或和(可持久化trie树、求最大区间异或和)
P4735 最大异或和 我们维护一个前缀异或和:s[i]=a[1]xora[2]xor-a[i−1]xora[i]s[i] = a[1] \ xor\ a[2]\ xor\ - a[i-1] \ xo ...
- P4735 最大异或和
P4735 最大异或和 题意: 一个非负序列a,初始长度为n,有两种操作: A x,在序列中添加x,n加一 Q l r x,询问操作,询问一个位置p,p满足l<=p<=r,使得p到位置n的 ...
- 洛谷P4735 最大异或和
题目链接 洛谷P4735 最大异或和 题目描述 给定一个非负整数序列 a{a}a,初始长度为nnn. 有 mmm 个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数 xxx,序列 ...
- P4735 最大异或和(可持久化字典树)
题目链接:P4735 最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型: 1 .A x:添加操作,表示在序列末尾添加一个数 x, ...
- P4735 最大异或和 01可持久化Trie树模板
原题:https://www.luogu.org/problemnew/show/P4735 题解:观察一下式子,将a数组求一个异或前缀和,其实就是s[n]^x^s[p-1]的最大值 p∈[l,r], ...
- Luogu P4735(可持久化字典树)
链接:点击打开链接 题意: 给定一个非负整数序列 {a},初始长度为n. 有 m 个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 n+1. Q l r x:询 ...
- P4735 最大异或和(可持久化字典树 ? 主席树)
异或满足可减性,所以可以维护前缀和,然后 a[p] xor a[p + 1] xor ... xor a[n] xor = s[p - 1] xor s[n] xor然后就只要维护s[].添加很好维护 ...
- Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)
题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...
最新文章
- redhat6.下安装配置hadoop环境--单实例版本
- boost::ratio_equal相关的测试程序
- 机器学习实战_09_树回归_源代码错误修正
- j2ee之原生AJAX
- shell基本运算符
- OPA 16 - how is mocked transaction types loaded in the runtime
- delete操作字符串会报错吗?
- 转录组拼接软件Trinity使用安装报错锦集
- cAdvisor的使用
- UVA - 10400 Game Show Math
- win7 计算机定时关机脚本,win7怎么定时关机?win7定时关机设置两种方法
- Youtube内容正在失控
- python爬虫公众号音频源代码_python爬取音频下载的示例代码
- FICO与MM的集成概述
- 《C专家编程》学习笔记
- html图片怎么做成链接,HTML的链接代码怎么做?HTML的图片链接怎么制作?
- 履带机器人动力总成_智能机器人在动力总成装配线中应用探讨
- Teamcenter云战略
- 何为数字化工厂?如何打造真正的数字化工厂?
- office Excel中的vlookup函数的使用
热门文章
- Ajax——判断用户名是否已经注册
- 管理学中常用的激励理论
- SSM中mybtis报错### The error may involve defaultParameterMap ### The error occurred while setting param
- java中Hashset集合删除元素_从Java中的HashSet中删除单个元素
- Windows系统封装(三)安装软件和系统优化清理。
- java pdf 图片替换_Java 添加、替换、删除PDF中的图片
- missing iso 9660 image the installer has tried to mount image #1
- Python Tox介绍和使用
- Openwrt MT7628/MT7620/MT7621——GPIO及LED/KEY的功能实现
- SpringCloud中Feign进行服务调用 java.io.IOException: too many bytes written 问题解决