http://acm.hdu.edu.cn/showproblem.php?pid=4757

给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 val 异或最大的值是多少。

和可持久化线段树差不多,看代码吧。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<vector>
using namespace std;
#define LL long long
const int maxn=;
const int maxm=;
int n,m;
int a[maxn]={},fa[maxn][]={},dep[maxn]={},rt[maxn]={};
int sig[maxm][]={},sz[maxm]={},cnt=;
struct nod{int y,next;}e[maxn*];int head[maxn],tot=;
inline void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
inline int getnew(){
sig[++cnt][]=;sig[cnt][]=;
sz[cnt]=;return cnt;
}
inline void bui(int x,int pa,int val){
rt[x]=getnew();pa=rt[pa];
x=rt[x];
for(int i=;i>=;--i){
int ch=(val>>i)&;
if(!sig[x][ch]){
int id=getnew();
sig[x][ch]=id; sig[x][!ch]=sig[pa][!ch];
sz[sig[x][ch]]=sz[sig[pa][ch]];
}
x=sig[x][ch];pa=sig[pa][ch];
++sz[x];
}
}
void dfs(int x){
bui(x,fa[x][],a[x]);
for(int i=;fa[x][i-];++i)fa[x][i]=fa[fa[x][i-]][i-];
for(int i=head[x];i;i=e[i].next){
if(e[i].y==fa[x][])continue;
fa[e[i].y][]=x;dep[e[i].y]=dep[x]+;dfs(e[i].y);
}
}
inline int getlca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=;i>=;--i)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;--i)if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}
return fa[x][];
}
int Query(int x,int y,int val){
int lc=getlca(x,y); int res=a[lc]^val;
x=rt[x];y=rt[y];lc=rt[lc];
int ret=;
for(int i=;i>=;--i){
int ch=(val>>i)&;
if(sz[sig[x][!ch]]+sz[sig[y][!ch]]-*sz[sig[lc][!ch]]>){
ret+=<<i;
ch=!ch;
}
x=sig[x][ch];y=sig[y][ch];lc=sig[lc][ch];
}
return max(res,ret);
}
int main(){
while(~scanf("%d%d",&n,&m)){
memset(head,,sizeof(head));memset(rt,,sizeof(rt));
memset(sig,,sizeof(sig));memset(fa,,sizeof(fa));
int x,y,z;tot=;cnt=;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<n;i++){scanf("%d%d",&x,&y);init(x,y);init(y,x);}
dep[]=;dfs();
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
printf("%d\n",Query(x,y,z));
}
}
return ;
}

HDU 4757 Tree 可持久化字典树 trie的更多相关文章

  1. HDU 4757 Tree 可持久化字典树

    Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...

  2. HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)

    题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...

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

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

  4. 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 ...

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

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

  6. 【HDU 6191】Query on A Tree 【可持久化字典树】

    题目 给出一棵有n个结点的树,树根是1,每个结点给出一个value.然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这 ...

  7. SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)

    You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 231, 1 ≤ N ≤ 12000). A query is defin ...

  8. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  9. 字典树trie学习

    字典树trie的思想就是利用节点来记录单词,这样重复的单词可以很快速统计,单词也可以快速的索引.缺点是内存消耗大 http://blog.csdn.net/chenleixing/article/de ...

随机推荐

  1. 将Sql查询语句获取的数据插入到List列表里面

    Sql查询语句获取的数据是分格式的,我们还用SqlDataReader来做,然后用IDataReader来接收读取,以下是代码: //我想查询一个用户表的信息,该用户有姓名,密码,信息三列 //1.定 ...

  2. eclipse 关闭控制台 自动弹出

    Eclipse的控制台console有时候经常的跳出来,非常的烦人! 尤其是在调试期间跳出,以下是分享一下设置操作: 让它不经常的调出来,可以按下面的操作去掉它: windows  ->   p ...

  3. 使用 git 托管代码

    1. 下载安装好 git 客户端 2. 找一个家代码托管平台 我用 coding.net,注册个账号,建一个空项目 然后打开安装好的 git bash 客户端,使用 git clone 命令克隆下远程 ...

  4. 【原创】backbone1.1.0源码解析之View

    作为MVC框架,M(odel)  V(iew)  C(ontroler)之间的联系是必不可少的,今天要说的就是View(视图) 通常我们在写逻辑代码也好或者是在ui组件也好,都需要跟dom打交道,我们 ...

  5. 概率dp(A - Scout YYF I POJ - 3744 )

    题目链接:https://cn.vjudge.net/contest/276241#problem/A 题目大意:首先输入n和p,n代表地雷的个数,p代表走一步的概率,1-p代表走两步的概率,然后问你 ...

  6. 2017/05/23 java 基础 随笔

    1.多态的好处: a.提高了代码的维护性(继承保证) b.提高了代码的扩展性(由多态保证) package com.huawei; public class Demo2 { public static ...

  7. 【Python】测试dpkt解析pcap

    1.前言 本想借助dpkt解析mail.dns.http来辅助分析pcap包进行分析,查阅资料学习却发现并不如使用scapy那么方便. dpkt是一个python模块,可以对简单的数据包创建/解析,以 ...

  8. Linux中Samba详细安装【转】

    转自:http://www.cnblogs.com/whiteyun/archive/2011/05/27/2059670.html 为了实现Windows主机与Linux服务器之间的资源共享,Lin ...

  9. 用Python连接SQLServer抓取分析数据、监控 (pymssql)

    Python 环境:python3 服务器环境: centos6.5 数据库: Mysql 大概流程:在装有Python服务器,利用pymssql库连接MSSQL生产数据库取出数据然后写进mysql数 ...

  10. php扩展Redis功能

    php扩展Redis功能 1 首先,查看所用php编译版本V6/V9 在phpinfo()中查看 2 下载扩展 地址:https://github.com/nicolasff/phpredis/dow ...