题意

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

思路

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

代码

#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
typedef long long LL;
using namespace std;
const int N=1e5+5;
template<const int maxn,const int maxm>struct Linked_list
{
int head[maxn],to[maxm],nxt[maxm],tot;
Linked_list(){clear();}
void clear(){memset(head,-1,sizeof(head));tot=0;}
void add(int u,int v){to[++tot]=v,nxt[tot]=head[u],head[u]=tot;}
#define EOR(i,G,u) for(int i=G.head[u];~i;i=G.nxt[i])
};
Linked_list<N,N>G;
struct Trie
{
struct node{int son[2],sum;};
node nd[N*32];
int rt[N],tot;
int &operator [](const int x){return rt[x];}
void build()
{
memset(rt,0,sizeof(rt));
nd[tot=0]=(node){0,0,0};
}
void create(int &k){nd[++tot]=nd[k],k=tot;}
void insert(int &k,int x,int n)
{
create(k),nd[k].sum++;
if(n<0)return;
insert(nd[k].son[x>>n&1],x&((1<<n)-1),n-1);
}
int query(int k,int p,int x,int n)
{
if(n<0)return 0;
if(nd[nd[k].son[~x>>n&1]].sum-nd[nd[p].son[~x>>n&1]].sum>0)
return (1<<n)|query(nd[k].son[~x>>n&1],nd[p].son[~x>>n&1],x&((1<<n)-1),n-1);
else return query(nd[k].son[x>>n&1],nd[p].son[x>>n&1],x&((1<<n)-1),n-1);
}
}Tr;
int n,q,p[N],L[N],R[N],ori[N],ord; void dfs(int u,int f)
{
L[u]=++ord,ori[ord]=u;
EOR(i,G,u)
{
int v=G.to[i];
if(v==f)continue;
dfs(v,u);
}
R[u]=ord;
} int main()
{
while(~scanf("%d%d",&n,&q))
{
Tr.build();
G.clear();
FOR(i,1,n)scanf("%d",&p[i]);
FOR(v,2,n)
{
int u;
scanf("%d",&u);
G.add(u,v);
}
ord=0;
dfs(1,0);
FOR(i,1,n)Tr.insert(Tr[i]=Tr[i-1],p[ori[i]],30);
while(q--)
{
int u,x;
scanf("%d%d",&u,&x);
printf("%d\n",Tr.query(Tr[R[u]],Tr[L[u]-1],x,30));
}
}
return 0;
}

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. QString字符串中双引号的梗

    [1]QString字符串不支持双引号 最近做项目(本地环境:WIN10 + QT5.9.2 + VS2017).有个需求,需要实现形如 "key="123456"&qu ...

  2. wrapper class (Integer 为例)

    1,导入 Integer a = 100; Integer b = 100; Integer c = 150; Integer d = 150; a == b; true c == d; false ...

  3. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  4. PHP HTML混写,PHP中把大块HTML文本直接赋值给字符串变量的方法

    PHP HTML混写,PHP中把大块HTML文本直接赋值给字符串变量的方法 使用HEREDOC/NOWDOCHEREDOC和NOWDOC是PHP5.3开始支持的一种新特性,它允许在程序中使用一种自定义 ...

  5. NFS客户端阻塞睡眠问题与配置调研

    Linux NFS客户端需要很小心地配置,否则在NFS服务器崩溃时,访问NFS的程序会被挂起,用ps查看,进程状态(STAT)处于D,意为(由于IO阻塞而进入)不可中断睡眠(如果是D+,+号表示程序运 ...

  6. C#简单线程

    一.实例1 static void Main(string [] args) { Console.WriteLine("开始线程"); startFunc(); Console.W ...

  7. 怎样从外网访问内网Jboss?

    本地安装了一个Jboss,只能在局域网内访问,怎样从外网也能访问到本地的Jboss呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Jboss 默认安装的Jboss端口是8080. 实现步骤 下载并 ...

  8. C++重载>>和<<(输入输出运算符)

    在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool.in ...

  9. 2019/3/25 wen 包,对象的行为

  10. zabbix 监控Nginx和PHP

    原理 Nginx和PHP(5.3及以上版本)都自带了一个状态页,默认没有开启,通过开启这个状态页即可获取实时的工作状态. Nginx状态获取 Nginx的配置默认是拒绝通过IP来访问,我们可以再默认虚 ...