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

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

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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<vector>
  7. using namespace std;
  8. #define LL long long
  9. const int maxn=;
  10. const int maxm=;
  11. int n,m;
  12. int a[maxn]={},fa[maxn][]={},dep[maxn]={},rt[maxn]={};
  13. int sig[maxm][]={},sz[maxm]={},cnt=;
  14. struct nod{int y,next;}e[maxn*];int head[maxn],tot=;
  15. inline void init(int x,int y){e[++tot].y=y;e[tot].next=head[x];head[x]=tot;}
  16. inline int getnew(){
  17. sig[++cnt][]=;sig[cnt][]=;
  18. sz[cnt]=;return cnt;
  19. }
  20. inline void bui(int x,int pa,int val){
  21. rt[x]=getnew();pa=rt[pa];
  22. x=rt[x];
  23. for(int i=;i>=;--i){
  24. int ch=(val>>i)&;
  25. if(!sig[x][ch]){
  26. int id=getnew();
  27. sig[x][ch]=id; sig[x][!ch]=sig[pa][!ch];
  28. sz[sig[x][ch]]=sz[sig[pa][ch]];
  29. }
  30. x=sig[x][ch];pa=sig[pa][ch];
  31. ++sz[x];
  32. }
  33. }
  34. void dfs(int x){
  35. bui(x,fa[x][],a[x]);
  36. for(int i=;fa[x][i-];++i)fa[x][i]=fa[fa[x][i-]][i-];
  37. for(int i=head[x];i;i=e[i].next){
  38. if(e[i].y==fa[x][])continue;
  39. fa[e[i].y][]=x;dep[e[i].y]=dep[x]+;dfs(e[i].y);
  40. }
  41. }
  42. inline int getlca(int x,int y){
  43. if(dep[x]<dep[y])swap(x,y);
  44. for(int i=;i>=;--i)if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
  45. if(x==y)return x;
  46. for(int i=;i>=;--i)if(fa[x][i]!=fa[y][i]){x=fa[x][i];y=fa[y][i];}
  47. return fa[x][];
  48. }
  49. int Query(int x,int y,int val){
  50. int lc=getlca(x,y); int res=a[lc]^val;
  51. x=rt[x];y=rt[y];lc=rt[lc];
  52. int ret=;
  53. for(int i=;i>=;--i){
  54. int ch=(val>>i)&;
  55. if(sz[sig[x][!ch]]+sz[sig[y][!ch]]-*sz[sig[lc][!ch]]>){
  56. ret+=<<i;
  57. ch=!ch;
  58. }
  59. x=sig[x][ch];y=sig[y][ch];lc=sig[lc][ch];
  60. }
  61. return max(res,ret);
  62. }
  63. int main(){
  64. while(~scanf("%d%d",&n,&m)){
  65. memset(head,,sizeof(head));memset(rt,,sizeof(rt));
  66. memset(sig,,sizeof(sig));memset(fa,,sizeof(fa));
  67. int x,y,z;tot=;cnt=;
  68. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  69. for(int i=;i<n;i++){scanf("%d%d",&x,&y);init(x,y);init(y,x);}
  70. dep[]=;dfs();
  71. for(int i=;i<=m;i++){
  72. scanf("%d%d%d",&x,&y,&z);
  73. printf("%d\n",Query(x,y,z));
  74. }
  75. }
  76. return ;
  77. }

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. python---基础知识回顾(三)(面向对象)

    一.多继承(寻找方法) 主要学习多继承中的寻找方法的方式:分别是深度优先和广度优先 1.当类是经典类时,多继承情况下,会按照深度优先方式查找 2.当类是新式类时,多继承情况下,会按照广度优先方式查找 ...

  2. 在android手机上通过Html5Plus调用java类。

    关于html5plus的资料参考http://www.html5plus.org/ 最近通过html5做手机app,其中涉及到网络通过,必须采用原生的socket,websocket无法满足要求,ht ...

  3. HTML5 中 Geolocation 获取地理位置的原理是什么?

    http://www.zhihu.com/question/20473051?sort=created geolocation的位置信息来源包括GPS.IP地址.RFID.WIFI和蓝牙的MAC地址. ...

  4. 环形缓冲区-模仿linux kfifo【转】

    转自:https://blog.csdn.net/vertor11/article/details/53741681 struct kfifo{ uint8_t *buffer; uint32_t i ...

  5. 大数据系列之数据仓库Hive安装

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  6. tomcat -> 简介&部署

    Tomcat 简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...

  7. ubuntu12.04安装maven

    step: 1,确认已经安装jdk, java --version 2,下载apache-maven-3.3.9 下载地址:http://maven.apache.org/download.cgi 3 ...

  8. [golang note] 环境搭建

    LiteIDE(windows) • golang安装 ▶ 下载对应操作系统的版本并安装,下载地址:http://www.golangtc.com/download,譬如这里下载的是go1.6.win ...

  9. Oracle学习笔记:使用replace、regexp_replace实现字符替换、姓名脱敏

    在数据库中难免会遇到需要对数据进行脱敏的操作,无论是姓名,还是身份证号. 最近遇到一个需求,需要对姓名进行脱敏: 姓名长度为2,替换为姓+*: 姓名长度为3,替换中间字符为*: 姓名长度为4,替换第3 ...

  10. ERP渠道活动管理(二十六)

    设计意义: 渠道活动的方式方法多种多样.不过,大至可分为销售型促销与市场型促销(一般来说,销售型促销以完成销售额为唯一目的,以奖励返点为唯一手段,以增大经销商库存为最终结果,短期行为明显.而市场型促销 ...