题意: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. HUD 2444 The Accomodation of Students (二分图染色+最大匹配)

    #include<iostream> #include<cstdio> #include<cstring> #define maxn 2010 using name ...

  2. entity 实体模型timeout设置

    public Entities(): base("name=Entities") { var adapter = (IObjectContextAdapter)this; var ...

  3. 判断在Android手机内, 页面重新刷新一次

    <script type="text/javascript"> var UA = navigator.userAgent.toLowerCase(); //androi ...

  4. Dhroid框架配置

    1.将dhroid文件夹作为一个Module导入,dhroid下载地址 2.在build.gradle中的dependencies节点中添加compile project(':dhroid') dep ...

  5. C# WebService 基础实例

    1.整个Demo结构:如下图: 2.新建项目--选择asp.net web服务应用程序TestWebService 3.重新命名Service1.asmx为MyService.asmx 4.右键MyS ...

  6. Android 的 Relative Layout 常量

    android:layout_above 将该控件的底部置于给定ID的控件之上                    --Rule that aligns a child's bottom edge ...

  7. eclipse中启动tomcat

    0.以下即使部署好,点小猫启动tomcat,有一个问题,修改jsp文件,本地tomcat中的此jsp并没有修改,如果右键项目启动,则会修改,不知道为什么 1. 首先发布项目,项目右键,run serv ...

  8. Hibernate 主键生成策略

    表示符生成器 描述 Increment 由hibernate自动以递增的方式生成表识符,每次增量为1 Identity 由底层数据库生成表识符.条件是数据库支持自动增长数据类型. Sequence H ...

  9. C文件函数总结

    1.fopen(打开文件) 表头文件 #include<stdio.h> 定义函数 FILE *fopen(const char * path,const char * mode); pa ...

  10. 二十分钟弄懂C++11 的 rvalue reference (C++ 性能剖析 (5))

    C++ 11加了许多新的功能.其中对C++性能和我们设计class的constructor或assignment可能产生重大影响的非rvalue reference莫属!我看了不少资料,能说清它的不多 ...