给你一个数,在一段区间内找到另一个数,使得他们的异或最大;

trie树上存储每个数的二进制位,查询时贪心查询能让当前高位取得1的位置;

实际上是一个求前缀和的思想。每个数都开一个trie树浪费空间,当前建树的时候基本是转移前面的树;

首先设当前二进制位为d,将前一棵树的d^1直接转移(因为以后也用不到这一半),然后再递归转移d

最后更新当前树的当前位置的树的大小。(方便以后查询);

查询时,设给出的数当前位为d,我们要找到一个d^1的数才可以使得数更大,如果siz[r]-siz[l]>0说明存在这样的数,否则不存在;

字典树空间要开maxn*(最大二进制位数)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e5+;
int n,q;
int trie[maxn*][];
int root[maxn];
int cnt;
int siz[maxn*]; void pushup(int nw)
{
siz[nw]=siz[trie[nw][]]+siz[trie[nw][]];
} void insert(int pre,int &nw,int i,int x)
{
nw=++cnt;
siz[nw]=siz[pre];
if(i<)
{
siz[nw]++;
return ;
}
int d=(x>>i)&;
trie[nw][d^]=trie[pre][d^];
insert(trie[pre][d],trie[nw][d],i-,x);
pushup(nw);
} int query(int l,int r,int i,int x)
{
if(i<) return ;
int d=(x>>i)&;
int t=siz[trie[r][d^]]-siz[trie[l][d^]];
if(t>) return query(trie[l][d^],trie[r][d^],i-,x)+(<<i);
else return query(trie[l][d],trie[r][d],i-,x);
} int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
insert(root[i-],root[i],,x);
} for(int i=;i<=q;i++)
{
int l,r,x;
scanf("%d%d%d",&x,&l,&r);
l++;r++;
printf("%d\n",query(root[l-],root[r],,x));
}
return ;
} /* */

可持久化01trie树——模板的更多相关文章

  1. 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)

    1295 XOR key 2 秒 262,144 KB 160 分 6 级题   给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...

  2. bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...

  3. 可持久化01Trie树【p4735(bzoj3261)】最大异或和

    Description 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N ...

  4. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

    可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...

  5. 可持久化0-1Trie树

    我跟可持久化数据结构杠上了 \(QwQ\) .三天模拟赛考了两次可持久化数据结构(主席树.可持久化0-1Trie树),woc. 目录: 个人理解 时空复杂度分析 例题及简析 一.个人理解 可持久化0- ...

  6. BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3519  Solved: 1493[Submit][Status][Discu ...

  7. 可持久化01Trie树+LCA【p4592】[TJOI2018]异或

    Description 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1\(\;x\;y\):查询节点\(x ...

  8. 区间第K小——可持久化线段树模板

    概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...

  9. 洛谷P3834【模板】可持久化线段树 1(主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

随机推荐

  1. 实战Go内存泄露【转】

    最近解决了我们项目中的一个内存泄露问题,事实再次证明pprof是一个好工具,但掌握好工具的正确用法,才能发挥好工具的威力,不然就算你手里有屠龙刀,也成不了天下第一,本文就是带你用pprof定位内存泄露 ...

  2. webpack 打包器

    创建目录mkdir demo && cd demo 产生package.json执行 npm init -y 先全局安装webpack和webpack-clinpm install w ...

  3. php数组的数学功能相关常用函数

    php数组中有一些函数与数学相关的函数,大多都是以array开头然后下划线接一个数学上的英文单词,如下: array_diff() array_diff_assoc() array_intersect ...

  4. Java自学-数组 创建数组

    Java 如何创建一个数组 数组是一个固定长度的,包含了相同类型数据的 容器 步骤 1 : 声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都 ...

  5. 【Excel】【Salesforce】函数拓展

    1.if 2.vlookup

  6. Flask整合WebLoader 用于大附件拆分上传再合并

    博客:https://blog.csdn.net/jinixin/article/details/77545140 github:https://github.com/jinixin/upload-d ...

  7. index.jsp乱码问题的解决

    我们在做java项目的时候,都会有个首页,一般就是index.jsp,然后在index.jsp中引入相关的文件,一般也是引入打包过后的相关资源文件. 当index.jsp上面的中文出现乱码的时候,就需 ...

  8. iframe页面script交互

    主页面: <html> <tr> <td> <div id=RightViewDiv> <iframe name=SubSeekFrame sty ...

  9. Docker 安装HDFS

    网上拉取Docker模板,使用singlarities/hadoop镜像 [root@localhost /]# docker pull singularities/hadoop 查看: [root@ ...

  10. 【HCIA Gauss】学习汇总-数据库管理(SQL语法 数据类型 函数)-4

    DDL data definition language 数据库定义语言 定义修改等DML data manipulation language 数据库操控语言 增删改 DCL data crontr ...