题意: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 套接字编程中要注意的细节

    隐患 1.忽略返回状态 第一个隐患很明显,但它是开发新手最容易犯的一个错误.如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失.反过来,这可能传播错误,使定位问题的源头变得困难. 捕获 ...

  2. git 取消/添加 某文件的跟踪

    如果我们不小心将某个文件加入了 git 版本控制,但是突然又不想继续跟踪控制这个文件了,怎么办呢? 使用 git update-index 即可. 不想继续追踪某个文件 git update-inde ...

  3. CentOS下FTP服务器安装与配置

    安装vsftpd yum install vsftpd 启动/重启/关闭vsftpd服务器 CentOS7 以下: 启动: service vsftpd start 停止: service vsftp ...

  4. ZOJ3527

    题意:给你一个有向图,一共N个顶点,且每个顶点只有一个前驱或后继,在顶点上建立圣地,那么就可以获得一个信仰值,如果在这个顶点的后继节点上也建立圣地,那么将改变一定的信仰值,求解能获取的最大信仰值. 思 ...

  5. LinkButton和HyperLink的页面跳转用法

    <%--<asp:HyperLink ID="HyperLink1" NavigateUrl='<%#"/Fxy_Admin/Pro_ClassNew. ...

  6. How do I size a UITextView to its content?

    UITextView 自适应高度,搬来一篇stack上的:   Is there a good way to adjust the size of a UITextView to conform to ...

  7. Objective-C学习篇06—NSString与NSMutableString

    NSString OC提供了定义字符串对象的方法,也就是将想要表达的字符串用一对双引号引起来,并在开头加上@.@是OC中的指令符,它告诉编译器@以后的内容为OC中的语法.比如@”Harbingwang ...

  8. 【USACO 1.3.1】混合牛奶

    [题目描述] 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助梅丽乳业找到最优的牛奶采购方案. 梅丽乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的. ...

  9. Android学习----发行版本

    Android 1.1(Bender“发条机器人”) Android 1.5( Cupcake“纸杯蛋糕”) Android 1.6(Donut 甜甜圈) Android 2.0(Éclair:闪电泡 ...

  10. Java简介(2)-基本概念

    1.抽象类:规定一个或多个抽象方法的类别本身必须定义为abstract,抽象类只是用来派生子类,而不能用它来创建对象 2.final类:又称“最终类”,它只能用来创建对象,而不能被继承,与抽象类刚好相 ...