题意

\(n\) 个点的有根树,根为 \(1\) 。每个点有点权,有 \(q\) 个询问,每次询问以 \(u\) 为根的子树的点的点权中异或 \(x\) 所得的最大值是多少。

思路

求出整棵树的 \(\text{dfs}\) 序,问题就转化成了序列上,求一个区间中的数字异或 \(x\) 可得的最大值。同样的方法,只需在原序列上建立可持久化的 \(\text{Trie}\) 树即可,和区间第 \(K\) 值类似的方法,在 ”主席\(\text{Trie}\) “上找最大解。

代码

  1. #include<bits/stdc++.h>
  2. #define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
  3. #define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
  4. typedef long long LL;
  5. using namespace std;
  6. const int N=1e5+5;
  7. template<const int maxn,const int maxm>struct Linked_list
  8. {
  9. int head[maxn],to[maxm],nxt[maxm],tot;
  10. Linked_list(){clear();}
  11. void clear(){memset(head,-1,sizeof(head));tot=0;}
  12. void add(int u,int v){to[++tot]=v,nxt[tot]=head[u],head[u]=tot;}
  13. #define EOR(i,G,u) for(int i=G.head[u];~i;i=G.nxt[i])
  14. };
  15. Linked_list<N,N>G;
  16. struct Trie
  17. {
  18. struct node{int son[2],sum;};
  19. node nd[N*32];
  20. int rt[N],tot;
  21. int &operator [](const int x){return rt[x];}
  22. void build()
  23. {
  24. memset(rt,0,sizeof(rt));
  25. nd[tot=0]=(node){0,0,0};
  26. }
  27. void create(int &k){nd[++tot]=nd[k],k=tot;}
  28. void insert(int &k,int x,int n)
  29. {
  30. create(k),nd[k].sum++;
  31. if(n<0)return;
  32. insert(nd[k].son[x>>n&1],x&((1<<n)-1),n-1);
  33. }
  34. int query(int k,int p,int x,int n)
  35. {
  36. if(n<0)return 0;
  37. if(nd[nd[k].son[~x>>n&1]].sum-nd[nd[p].son[~x>>n&1]].sum>0)
  38. return (1<<n)|query(nd[k].son[~x>>n&1],nd[p].son[~x>>n&1],x&((1<<n)-1),n-1);
  39. else return query(nd[k].son[x>>n&1],nd[p].son[x>>n&1],x&((1<<n)-1),n-1);
  40. }
  41. }Tr;
  42. int n,q,p[N],L[N],R[N],ori[N],ord;
  43. void dfs(int u,int f)
  44. {
  45. L[u]=++ord,ori[ord]=u;
  46. EOR(i,G,u)
  47. {
  48. int v=G.to[i];
  49. if(v==f)continue;
  50. dfs(v,u);
  51. }
  52. R[u]=ord;
  53. }
  54. int main()
  55. {
  56. while(~scanf("%d%d",&n,&q))
  57. {
  58. Tr.build();
  59. G.clear();
  60. FOR(i,1,n)scanf("%d",&p[i]);
  61. FOR(v,2,n)
  62. {
  63. int u;
  64. scanf("%d",&u);
  65. G.add(u,v);
  66. }
  67. ord=0;
  68. dfs(1,0);
  69. FOR(i,1,n)Tr.insert(Tr[i]=Tr[i-1],p[ori[i]],30);
  70. while(q--)
  71. {
  72. int u,x;
  73. scanf("%d%d",&u,&x);
  74. printf("%d\n",Tr.query(Tr[R[u]],Tr[L[u]-1],x,30));
  75. }
  76. }
  77. return 0;
  78. }

HDU 6191 Query on A Tree(可持久化Trie)的更多相关文章

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

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

  2. HDU 6191 Query on A Tree(可持久化Trie+DFS序)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

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

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

  4. [hdu 6191] Query on A Tree

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  5. HDU 6191 Query on A Tree(字典树+离线)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

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

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

  7. HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序

    题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...

  8. HDU4757 Tree(可持久化Trie)

    写过可持久化线段树,但是从来没写过可持久化的Trie,今天补一补. 题目就是典型的给你一个数x,和一个数集,问x和里面的某个数xor起来的最大值是多少. 最原始的是数集是固定的,只需要对数集按照高到低 ...

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

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

随机推荐

  1. python - 6. Defining Functions

    From:http://interactivepython.org/courselib/static/pythonds/Introduction/DefiningFunctions.html Defi ...

  2. ClassOne__HomeWork

    1,static类型 static类型定义有两类,一类是静态数据,另一类是静态函数. 静态数据跟成员变量不同,它可以通过类名直接访问,而不需要通过定义对象来访问.它的的生成也和成员变量不一样,它只生成 ...

  3. Linux基础命令---文本显示tac

    tac 将指定文件中的行,按照反序方式显示.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法         tac [选项] ...

  4. kali linux下 hachcat安装

    网上关于hachcat的简单使用方法介绍很多,然而却很少有在kali linux上的安装教程,找了好长时间,终于安装成功了,特此将中间借鉴的内容记录如下: #首先安装p7z,用于解压下载的p7z包 # ...

  5. SQL Server中调用WebService

    首先要启用Ole Automation Procedures,使用sp_configure 配置时如果报错"不支持对系统目录进行即席更新",可以加上WITH OVERRIDE选项. ...

  6. linux下的ifconfig命令

    ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置. 1.命令格式: ifconfig [网络设备] [参数] 2.命令功能: ifconfig 命令用来查看和配置网络设 ...

  7. The logback manual #03# Configuration

    索引 Configuration in logback Automatically configuring logback Automatic configuration with logback-t ...

  8. Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战

    基础知识 class scrapy.spiders.CrawlSpider 这是抓取一般网页最常用的类,除了从Spider继承过来的属性外,其提供了一个新的属性rules,它提供了一种简单的机制,能够 ...

  9. ssh客户端连接报认证失败

    最近有个应用在并发导出的时候,报错了ssh认证失败,原来串行的时候都正常,经查,可能是ssh连接数不够的原因,这个问题刚好之前有个java开发反馈过,linux默认的ssh连接数为10个. 解决如下: ...

  10. com.mchange.v2.c3p0.impl.NewPooledConnection@be1839d closed by a client的正确解答

    关于c3p0在debug模式下控制台抛出的如下异常: java.lang.Exception: DEBUG -- CLOSE BY CLIENT STACK TRACE at com.mchange. ...