题目链接

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

分析 :

看到这种树上异或最值的问题

可以考虑使用 Trie 来解决

首先涉及到子树

我们可以利用 DFS 序来构造出每个根的子树

DFS 序有很好的性质、其子树的所有节点必定是序列中连续的一段

那么我们就可以对这个 DFS 序列建立可持久化 Trie

然后通过类似前缀和减法的方式得到问询节点子树表示的区间中

所有数组成的 Trie 、然后通过贪心的方法来得到最大异或值

#include<bits/stdc++.h>
using namespace std;
;
);
int root[maxn];
int sz[maxNode];
];
;

int newNode()
{
    totNode++;
    memset(ch[totNode], , sizeof(ch[totNode]));
    sz[totNode] = ;
    return totNode;
}

inline void Insert(int F, int C, int val)
{
    F = root[F], C = root[C];
    ; i>=; i--){
        ;
        if(!ch[C][bit]){
            ch[C][bit] = newNode();
            ch[C][!bit] = ch[F][!bit];
            sz[ ch[C][bit] ] = sz[ ch[F][bit] ];
        }
        C = ch[C][bit], F = ch[F][bit];
        sz[C]++;
    }
}

int Query(int x, int y, int val)
{
    ;
    ; i>=; i--){
        ;
        )
            ret += (<<i),
            y = ch[y][!c],
            x = ch[x][!c];
        else x = ch[x][c], y = ch[y][c];
    }
    return ret;
}

struct EDGE{ int v, w, nxt; }Edge[maxn];
;
int weight[maxn];

inline void Edge_init(int n)
{
    memset(sz, , sizeof(sz));
    memset(ch, , sizeof(ch));
    memset(Head, -, sizeof(Head));
    EdgeCnt = ;
}

inline void AddEdge(int From, int To, int Weight)
{
    Edge[EdgeCnt].v = To;
    Edge[EdgeCnt].w = Weight;
    Edge[EdgeCnt].nxt = Head[From];
    Head[From] = EdgeCnt++;
}

;
int st[maxn], en[maxn];
void DFS(int v)
{
    st[v] = squLen;
    squ[squLen++] = v;
    ; i=Edge[i].nxt){
        int Eiv = Edge[i].v;
        DFS(Eiv);
    }
    en[v] = squLen-;
}

int main(void)
{

    int n, q;
    while(~scanf("%d %d", &n, &q)){

        squLen = ;
        totNode = ;
        Edge_init(n);

        ; i<=n; i++) scanf("%d", &weight[i]);
        ; i<=n-; i++){
            int Fa; scanf("%d", &Fa);
            AddEdge(Fa, i+, weight[i]);
        }

        DFS();

        root[] = ch[][] = ch[][] = ;
        ; i<squLen; i++) root[i] = newNode();
        ; i<squLen; i++)
            Insert(i-, i, weight[squ[i]]);

        while(q--){
            int v, x;
            scanf("%d %d", &v, &x);
            printf(, en[v], x));
        }
    }
    ;
}

HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )的更多相关文章

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

  2. [hdu 6191] Query on A Tree

    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(字典树+离线)

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

  4. HDU 6191 Query on A Tree(可持久化Trie)

    题意 \(n\) 个点的有根树,根为 \(1\) .每个点有点权,有 \(q\) 个询问,每次询问以 \(u\) 为根的子树的点的点权中异或 \(x\) 所得的最大值是多少. 思路 求出整棵树的 \( ...

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

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

  6. 2017广西邀请赛 Query on A Tree (可持续化字典树)

    Query on A Tree 时间限制: 8 Sec  内存限制: 512 MB提交: 15  解决: 3[提交][状态][讨论版] 题目描述 Monkey A lives on a tree. H ...

  7. 2017ACM/ICPC广西邀请赛-重现赛

    HDU 6188 Duizi and Shunzi 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 思路: 签到题,以前写的. 实现代码: #inc ...

  8. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  9. hdu 4836 The Query on the Tree(线段树or树状数组)

    The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

随机推荐

  1. (5.10)mysql高可用系列——percona-toolkit工具下的pt-table-checksum 在线验证主从一致性【续写中】

    关键词:percona-toolkit 工具包中包含 pt-table-checksum工具,在线验证主从一致性 [1]percona-toolkit 工具包 [1.1]percona-toolkit ...

  2. Codeforces 1194F. Crossword Expert

    传送门 考虑每一个位置的期望贡献 $P[i]$ 对于第 $k$ 个位置,设 $sum=\sum_{i=1}^{k}t[k]$,那么 $T-sum$ 即为用最短时间完成完位置 $k$ 后多出来的空闲时间 ...

  3. 第二章:排序算法 及其他 Java代码实现

    目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...

  4. 前端页面多级联动传输数据类型问题(数组or字符串)后端处理

    在最近的工作中,遇到一个问题,个人所做的简历模块中有两个字段,分别是个人信息中的户口所在地和现居住城市. 前端界面中这两个选项框是用到了二级和三级联动,在向后端传输时希望可以通过数组类型进行传输,例如 ...

  5. 优秀java博客

    https://www.jianshu.com/p/efb58b7115bf?utm_source=tuicool https://www.nowcoder.com/discuss/110317 ht ...

  6. 权限(rwx)对于目录与文件的意义

    1-权限对于目录的意义 首先要明白的是目录主要的内容是记录文件名列表和子目录列表,而不是实际存放数据的地方. r权限:拥有此权限表示可以读取目录结构列表,也就是说可以查看目录下的文件名和子目录名,注意 ...

  7. Linux Exploit系列之二 整数溢出

    整数溢出 虚拟机安装:Ubuntu 12.04(x86) 什么是整数溢出? 存储大于最大支持值的值称为整数溢出.整数溢出本身不会导致任意代码执行,但整数溢出可能会导致堆栈溢出或堆溢出,这可能导致任意代 ...

  8. 工具安装——linux下安装JDK1.8

    1.查看Linux环境自带JDK 使用命令:# rpm -qa|grep gcj 显示内容其中包含相应信息# java-x.x.x-gcj-compat-x.x.x.x-xxjpp# java-x.x ...

  9. 使用Mybatis Generator自动生成代码

    MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代码.它将内省数据库 ...

  10. openstack mitaka开启三层网络vxlan

    在这之前,先把之前基于flat模式创建的虚机,全部删除 控制节点: 配置 修改/etc/neutron/neutron.conf的[DEFAULT]区域 将 core_plugin = ml2 ser ...