题意:n个点的树,Q次询问,询问u-v路径上的点的权值与z抑或的最大值。

先考虑,在一个区间上的问题,可以先建一个可持久化的Trie,然后每次询问,就和线段树的操作差不多,从最高位开始考虑选1还是选0。

在树上的话, 可以转化成 parent[LCA(u, v)] - u ,  parent[LCA(u, v)] - v,这两个区间的最大值。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e5 + ;
const int maxdep = ;
const int maxlog = ;
vector <int> G[maxn];
int idx, A[maxn];
//可持久化Trie, 初始状态val为0
int tree[maxn], lson[maxn * maxlog], rson[maxn * maxlog], val[maxn * maxlog];
int insert(int root, int x){ // x为每次插入的值
int newroot = idx++;
int tmp = newroot;
for (int i = ; i >= ; i--){
if (!(x & ( << i))){
lson[newroot] = idx++;
rson[newroot] = rson[root];
newroot = lson[newroot];
root = lson[root];
}else{
rson[newroot] = idx++;
lson[newroot] =lson[root];
newroot = rson[newroot];
root = rson[root];
}
val[newroot] = val[root] + ;
}
return tmp;
}
int query (int ua, int ub, int z, int d){
if (d == -){
return ;
}
int res = ;
if (z & ( << d)){
if (val[lson[ub]] - val[lson[ua]]){
res ^= << d;
res += query(lson[ua], lson[ub], z, d-);
}else{
res = query(rson[ua], rson[ub], z, d-);
}
}else{
if (val[rson[ub]] - val[rson[ua]]){
res ^= << d;
res += query(rson[ua], rson[ub],z, d-);
}else{
res = query(lson[ua], lson[ub], z, d-);
}
}
return res;
}
int parent[maxdep][maxn], dep[maxn];
void dfs(int u, int father){
parent[][u] = father;
dep[u] = dep[father] + ;
tree[u] = insert(tree[father], A[u]);
for (int v: G[u]){
if (v != father){
dfs(v, u);
}
}
}
void lca_init(int n){
dfs(, );
for (int k = ; k + < maxdep; k++){
for (int v = ; v <= n; v++){
if (parent[][v] <= ){
parent[k+][v] = -;
}else{
parent[k+][v] = parent[k][parent[k][v]];
}
}
}
}
int lca(int u, int v){
if (dep[u] > dep[v]){
swap(u, v);
}
for (int k = ; k < maxdep; k++){
if ((dep[v] - dep[u]) >> k & ){
v = parent[k][v];
}
}
if (u == v){
return u;
}
for (int k = maxdep-; k >= ; k--){
if (parent[k][u] != parent[k][v]){
u = parent[k][u];
v = parent[k][v];
}
}
return parent[][u];
}
void init(){
for (int i = ; i < maxn; i++){
G[i].clear();
}
idx = ;
memset(val, , sizeof (val));
}
void debug(int x, int i){
if (val[lson[x]]){
printf("%d,0 ", i);
debug(lson[x], i-);
} if (val[rson[x]]){
printf("%d,1 ", i);
debug(rson[x], i-);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
int n, m;
while (~ scanf ("%d%d", &n, &m)){
init();
for (int i = ; i <= n; i++){
scanf ("%d", A+i);
}
for (int i = ; i < n-; i++){
int u, v;
scanf ("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(, );
lca_init(n);
for (int i = ; i < m; i++){
int u, v, c;
scanf ("%d%d%d", &u, &v, &c);
int tmp = parent[][lca(u, v)];
printf("%d\n", max(query(tree[tmp], tree[u], c, ), query(tree[tmp], tree[v], c, )));
}
}
return ;
}

HDU4757--Tree 可持久化trie + LCA的更多相关文章

  1. HDU4757 Tree(可持久化Trie)

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

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

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

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

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

  4. hdu4757(可持久化 Trie )

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

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

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

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

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

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

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

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

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

  9. BZOJ4477 JSOI2015字符串树(可持久化trie)

    树上建可持久化trie即可,有点过于裸了.darkbzoj过了然而在bzoj一直wa,不知道哪有锅. #include<iostream> #include<cstdio> # ...

随机推荐

  1. Linux Terminal 控制终端的使用

    1. Open new Terminal:Ctrl + Alt + T 或者 Ctrl + Shift + N 2. Open Tab:Ctrl + Shift + T 3. Close Tab:Ct ...

  2. warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx

    先来一段json_decode官方说明 mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, i ...

  3. Linux防火墙配置

    防火墙命令 service iptables stop --停止 service iptables start --启动文件  /etc/sysconfig/iptables # Firewall c ...

  4. 模板-->单变元模线性方程

    如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 extend_gcd模板 poj_2115_C Looooops,my_ac_code 简单的测试 None 代码模板 / ...

  5. Linq101-QueryExecution

    using System; using System.Linq; namespace Linq101 { class QueryExecution { /// <summary> /// ...

  6. 用Global.asax实现伪静态.

    在Global.asax文件里添加Application_BeginRequest事件处理.添加如下代码: 1 protected void Application_BeginRequest(Obje ...

  7. bash shell学习-正则表达式基础 (笔记)

    A gentleman is open-minded and optimistic; a small person is narrow-minded and pessimistic. "君子 ...

  8. Python新手学习基础之数据结构-对数据结构的认知

    什么是数据结构? 数据结构是指:相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 举个列子来理解这个数据结构: 数据可以比作是书本, 数据结构相当于书架,书存放在书架上, ...

  9. MVC linq语法分页

    分页效果图: 表格下面的分页按钮样式是我自己做的一个样式,这4个按钮都是用同一张图片:这张图片是用ps做的. 接下来我们说一下怎么去做这个样式 第一css代码: ._HomePage,._Previo ...

  10. 牛人总结python中string模块各属性以及函数的用法,果断转了,好东西

    http://blog.chinaunix.net/uid-25992400-id-3283846.html http://blog.csdn.net/xiaoxiaoniaoer1/article/ ...