写过可持久化线段树,但是从来没写过可持久化的Trie,今天补一补。

题目就是典型的给你一个数x,和一个数集,问x和里面的某个数xor起来的最大值是多少。

最原始的是数集是固定的,只需要对数集按照高到低位去建Trie,然后贪心匹配就可以了。

这里则是对树上路径的操作,其实也是一样的,对每个节点x维护root到x的Trie,然后纪录下往左走往右走的叶子节点个数,设z=lca(x,y),那么到了个某个节点能否往某个儿子走的限制条件是 sz[ch[x][c]]+sz[ch[y][c]]-2*sz[ch[z][c]]>0,这样说明下面是存在c的儿子的,接着往下走即可。当然这样算其实是会漏掉lca的,所以最后还要和lca取最大值。

区间的询问作为这题的特例同理也是可以处理的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cassert>
#include <vector>
#include <set>
using namespace std; #define maxn 120000
#define maxnode 2200000
#define maxlogv 16
vector<int> G[maxn];
int n,m;
int a[maxn]; int f[maxlogv+2][maxn];
int dep[maxn];
int ch[maxnode][2];
int sz[maxnode];
int tot;
int root[maxn]; int newnode(){
memset(ch[tot],0,sizeof(ch[tot]));
sz[tot]=0;
return tot++;
} // insert val for x with father as y
void insert(int x,int y,int val)
{
x=root[x];y=root[y];
for(int i=15;i>=0;--i){
int c=(val>>i)&1;
if(!ch[x][c]){
int id=newnode();
ch[x][c]=id;
ch[x][!c]=ch[y][!c];
sz[ch[x][c]]=sz[ch[y][c]];
}
x=ch[x][c],y=ch[y][c];
++sz[x];
}
} void dfs(int u,int fa)
{
f[0][u]=fa;dep[u]=dep[fa]+1;
root[u]=newnode();
insert(u,fa,a[u]);
for(int i=0;i<G[u].size();++i){
int v=G[u][i];
if(v==fa) continue;
dfs(v,u);
}
} int lca(int u,int v)
{
if(dep[u]>dep[v]) swap(u,v);
for(int k=0;k<maxlogv;++k){
if( (dep[v]-dep[u])>>k&1){
v=f[k][v];
}
}
if(u==v) return u;
for(int k=maxlogv-1;k>=0;--k){
if(f[k][u]!=f[k][v]){
u=f[k][u];
v=f[k][v];
}
}
return f[0][u];
} int query(int x,int y,int val)
{
int z=lca(x,y);int res=a[z]^val;
x=root[x],y=root[y],z=root[z];
int ret=0;
for(int i=15;i>=0;--i){
int c=(val>>i)&1;
if(sz[ch[x][!c]]+sz[ch[y][!c]]-2*sz[ch[z][!c]]>0){
ret+=1<<i;
c=!c;
}
x=ch[x][c];
y=ch[y][c];
z=ch[z][c];
}
return max(ret,res);
} int main()
{
while(cin>>n>>m){
for(int i=1;i<=n;++i){
scanf("%d",a+i);
G[i].clear();
}
int ui,vi;
for(int i=0;i<n-1;++i){
scanf("%d%d",&ui,&vi);
G[ui].push_back(vi);
G[vi].push_back(ui);
}
memset(root,0,sizeof(root));
tot=1;
memset(f,0,sizeof(f));
memset(sz,0,sizeof(sz));
dep[0]=0;
dfs(1,0);
for(int k=0;k+1<maxlogv;++k){
for(int v=1;v<=n;++v){
if(f[k][v]==0) f[k+1][v]=0;
else f[k+1][v]=f[k][f[k][v]];
}
}
int xi,yi,zi;
for(int i=0;i<m;++i){
scanf("%d%d%d",&xi,&yi,&zi);
printf("%d\n",query(xi,yi,zi));
}
}
return 0;
}

HDU4757 Tree(可持久化Trie)的更多相关文章

  1. HDU.4757.Tree(可持久化Trie)

    题目链接 \(Description\) 给定一棵树,点有点权.\(Q\)次询问\(x,y,z\),求\(x\)到\(y\)的简单路径中,与\(z\)异或能得到的最大的数是多少. \(Solution ...

  2. hdu4757(可持久化 Trie )

    hdu4757 题意 给出一棵树,每个节点有权值,每次查询节点 \((u, v)\) 以及 \(x\) ,问 \(u\) 到 \(v\) 路径上的某个节点与 \(x\) 异或最大的值是多少. 分析 T ...

  3. Hdu-4757 Tree(可持久化字典树+lca)

    题目链接:点这 我的github地址:点这     Problem Description   Zero and One are good friends who always have fun wi ...

  4. HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Su ...

  5. HDU 4757 Tree(可持久化trie)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意:给出一棵树,节点有权值.每次询问x到y的路径上与z抑或的最大值. 思路:可持久化trie. ...

  6. HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )

    题目链接 题意 : 给你一棵树.树上的每个点都有点权.之后有若干次问询.每次问询给出一个节点编号以及一个整数 X .问你以给出节点为根的子树中哪个节点和 X 异或最大.输出这个值 分析 : 看到这种树 ...

  7. HDU4757--Tree 可持久化trie + LCA

    题意:n个点的树,Q次询问,询问u-v路径上的点的权值与z抑或的最大值. 先考虑,在一个区间上的问题,可以先建一个可持久化的Trie,然后每次询问,就和线段树的操作差不多,从最高位开始考虑选1还是选0 ...

  8. hdu 6191--Query on A Tree(持久化字典树)

    题目链接 Problem Description Monkey A lives on a tree, he always plays on this tree. One day, monkey A l ...

  9. 可持久化 trie 的简单入门

    可持久化 $trie$  ....又是一个表里不一的东西..... 可持久化 $trie$  的介绍: 和主席树类似的,其实可持久化就是体现在前缀信息的维护上(搞不懂这怎么就叫做可持久化了...) $ ...

随机推荐

  1. 服务器常说的U是什么意思?

    U是英文单词:unit 所说的1U和2U,是服务器的厚度,1U大概是相当于机柜的两个小格子,2U是四个格子.1U大概是4.45厘米(1U=1.75英寸,1英寸=2.54CM).以下这个是图片:

  2. 动态规划:HDU2571-命运

    解题心得: 1.其实是一个简单的动态规划加上贪心的思想,思路简单,只需要求每一步的最大值就可以了,但是要注意读懂题. 2.走的规则:从左上角开始走,达到右下角,只能向右走一步,或者向下走一步,或者走列 ...

  3. 笔记-python-装饰器

    笔记-python-装饰器 1.  装饰器 装饰器的实质是返回的函数对象的函数,其次返回的函数对象是可以调用的,搞清楚这两点后,装饰器是很容易理解的. 1.1.  相关概念理解 首先,要理解在Pyth ...

  4. 笔记-Python-cProfile

    笔记-Python-cProfile 1. 简介python官方提供了cProfile和profile对程序进行性能分析,建议使用cProfile; cProfile:基于lsprof的用C语言实现的 ...

  5. 快速从mysqldump文件中恢复一个表

    快速从较大的mysqldump文件中恢复一个表到数据库中: 1.先获取目标表(md_gas_check_record)在文件中的位置 [publish@LF-PRO-DB-01 ~]$ cat dby ...

  6. RCP 主题切换

    第一步 编写css文件,放到项目目录下 第二步 添加切换主题扩展点 第三步 设置主题   public  void switchTheme(String themeID) {           Bu ...

  7. Spring加载配置文件的几种方法(org.springframework.beans.factory.BeanDefinitionStoreException)

    一:Spring中的几种容器都支持使用xml装配bean,包括:XmlBeanFactory ,ClassPathXmlApplicationContext ,FileSystemXmlApplica ...

  8. CodeForces 781D Axel and Marston in Bitland DP

    题意: 有一个\(n\)个点\(m\)条边的无向图,边有两种类型,分别用\(0\)和\(1\)标识 因此图中的任意一条路径都对应一个\(01\)字符串 定义一个无限长的字符串\(s\): 开始令\(s ...

  9. HttpRunnerManager 接口自动化测试平台 搭建实践

    一.需要准备的知识点 1. linux: 安装 python3.nginx 安装和配置.mysql 安装和配置 2. python: django 配置.uwsgi 配置 二.我搭建的环境 1. Ce ...

  10. 1、IOS学习计划

    2015年12月10日 -- 2015年12月27日(一共3个周末,12个个工作日) 1.斯坦福公开课(IOS7应用开发) 一共18节课程,通过视频和demo建立感觉 2.千峰的OC课程 一共25节课 ...