可持久化01trie树——模板
给你一个数,在一段区间内找到另一个数,使得他们的异或最大;
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树——模板的更多相关文章
- 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] ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- 可持久化01Trie树【p4735(bzoj3261)】最大异或和
Description 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的长度\(N ...
- [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...
- 可持久化0-1Trie树
我跟可持久化数据结构杠上了 \(QwQ\) .三天模拟赛考了两次可持久化数据结构(主席树.可持久化0-1Trie树),woc. 目录: 个人理解 时空复杂度分析 例题及简析 一.个人理解 可持久化0- ...
- BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3519 Solved: 1493[Submit][Status][Discu ...
- 可持久化01Trie树+LCA【p4592】[TJOI2018]异或
Description 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1\(\;x\;y\):查询节点\(x ...
- 区间第K小——可持久化线段树模板
概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...
- 洛谷P3834【模板】可持久化线段树 1(主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
随机推荐
- mysql存储过程简单例子
1.之前经常在oracle数据库中使用存储过程,换到mysql后用的不多,但是有时候也用,大致记录一下,基本和oracle的一样. CREATE DEFINER = `root`@`%` PROCED ...
- 解读HTTP/3
技术的发展总是让人目不暇接,2018年10月,HTTP/3又发布了.虽然已经有一些中文技术媒体做了报道,但大多数是翻译的,而且内容大同小异.最近我专门学习了点关于HTTP/3的知识,在这里随便写写,和 ...
- Vue父子,子父,非父子组件之间传值
Vue组件基础 纯属随笔记录,具体详细教程,请查阅vue.js网站 子组件给父组件传值: <body> <div id="app"> <my-app& ...
- 79.mobile/js---手机端分享调用功能的实现(只能在真机上测试有效)
html:<a href="javascript:void(0);" class="all-share" onclick="call('defa ...
- mongos
官方文档:https://docs.mongodb.com/manual/reference/program/mongos/#bin.mongos mongos是MongoDB shard的缩写,它是 ...
- linux技能点七 shell
shell脚本:定义,连接符,输入输出流,消息重定向,命令的退出状态,申明变量,运算符,控制语句 定义:linux下的多命令操作文件 连接符: ::用于命令的分隔符,命令会从左往右依次执行 & ...
- jstorm了解—应用场景
JStorm处理数据的方式是基于消息的流水线处理, 因此特别适合无状态计算,也就是计算单元的依赖的数据全部在接受的消息中可以找到, 并且最好一个数据流不依赖另外一个数据流. 因此,常常用于: 日志分析 ...
- MapReduce1.x与MapReduce2.x差异
一.MapReduce1.x简介 1.图解 2.JobTracker 主节点,单点,负责调度所有的作用和监控整个集群的资源负载. 3.TaskTracker 从节点,自身节点资源管理和JobTrack ...
- fastJSON的常用方法总结
fastJSON的常用方法总结 fastJSON中常用的对象是JSON,JSONArray,JSONObject三个对象.常用的方法如对象转为JSON字符串,JSON字符串转为对象,JSON字符串转为 ...
- wget详解
wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...