题意:询问树上结点x到结点y路上上的权值异或z的最大值。

任意结点权值 ≤ 2^16,可以想到用字典树。

但是因为是询问某条路径上的字典树,将字典树可持续化,字典树上的结点保存在这条路径上的二进制数。

按照dfs序建树,结点u的字典树表示u到根结点路径上的字典树。

如果两个结点u和v,在同一条通往根结点的路径上,将会满足可减性。

因此只需要知道u、v、lca和fa[lca]四个结点的字典树就可以回答了。

/*********************************************************
* ------------------ *
* author AbyssFish *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<numeric>
#include<climits>
using namespace std; const int maxn = 1e5+;
const int maxd = ;
const int maxnds = (maxd+)*maxn; int hd[maxn], nx[maxn<<], to[maxn<<], ec;
void add_edge(int u,int v)
{
nx[ec] = hd[u];
to[ec] = v;
hd[u] = ec++;
}
void init_g(int n){ memset(hd+,0xff,n*sizeof(int)); ec = ; }
#define eachedge int i = hd[u]; ~i; i = nx[i]
#define ifvalid int v = to[i]; if(v == fa[u]) continue; struct Node
{
int ch[];
int v;
}p[maxnds];
int tot; int n,m;
int stk[maxd+]; inline int *dcmp(int x)
{
for(int i = ; i < maxd; i++){
stk[i] = x>>i&;
}
return stk;
} void build(int *o, int v)
{
int *s = dcmp(v);
for(int i = maxd-; i >= ; i--){
o = &(p[*o].ch[s[i]]);
p[++tot] = p[*o];
*o = tot;
p[*o].v++;
}
} int a[maxn];
int fa[maxn];
int root[maxn]; void dfs_build(int u,int f = )
{
p[root[u] = ++tot] = p[root[fa[u] = f]];
build(root+u,a[u]);
for(eachedge){
ifvalid
dfs_build(v,u);
} } int *c_cmp;
bool cmp_id(int i,int j){ return c_cmp[i] < c_cmp[j]; } int dep[maxn];
int path[maxn<<];
int pid[maxn];
int dfs_clk; void get_path(int u,int d)
{
dep[u] = d;
path[++dfs_clk] = u;
pid[u] = dfs_clk;
for(eachedge){
ifvalid
get_path(v,d+);
path[++dfs_clk] = u;
}
} struct SparseTable
{
int mxk[maxn<<];
int d[maxn<<][];
void init(int *mp,int *r, int n)
{
mxk[] = -;
for(int i = ; i <= n; i++){
d[i][] = r[i];
mxk[i] = ((i&(i-)) == ) ?mxk[i-]+:mxk[i-];
}
c_cmp = mp;
for(int j = ; j <= mxk[n]; j++){
int t = (<<j)-, s = <<(j-);
for(int i = ; i + t <= n; i++){
d[i][j] = min(d[i][j-],d[i+s][j-],cmp_id);
}
} }
int RMQ(int l,int r)
{
int k = mxk[r-l];
return min(d[l][k],d[r-(<<k)][k],cmp_id);
}
}rmq; void lca_init(int u)
{
dfs_clk = ;
get_path(u,);
rmq.init(dep,path,dfs_clk);
} int q_lca(int u, int v)
{
if(pid[u] > pid[v]) swap(u,v);
return rmq.RMQ(pid[u],pid[v]+);
} vector<int> Tree; int cal_ch(int d)
{
int re = ;
for(int i = ; i < (int)Tree.size(); i++){
int o = Tree[i];
re += o >= ? p[p[o].ch[d]].v : -p[p[-o].ch[d]].v;
}
return re;
} void dump(int d)
{
for(int i = ; i < (int)Tree.size(); i++){
int &o = Tree[i];
o = o >= ? p[o].ch[d] : -p[-o].ch[d];
}
} int query(int x,int y,int z)
{
int re = z&~((<<)-);
int *s = dcmp(z);
Tree.clear();
Tree.push_back(root[x]);
Tree.push_back(root[y]);
int lca = q_lca(x,y);
Tree.push_back(-root[lca]);
Tree.push_back(-root[fa[lca]]); int tmp = ;
for(int i = maxd-; i >= ; i--, tmp <<= ){
int d = s[i]^;
if(cal_ch(d)){
tmp |= ;
dump(d);
}
else dump(d^);
}
return re|(tmp>>);
} void solve()
{
for(int i = ; i <= n; i++){
scanf("%d",a+i);
}
init_g(n);
for(int i = ,u,v; i < n; i++){
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
tot = ;
dfs_build();
lca_init();
for(int i = , x, y, z; i < m; i++){
scanf("%d%d%d",&x,&y,&z);
printf("%d\n",query(x,y,z));
}
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
//p[0] = {{0,0},0}; //root[0] = 0;
while(~scanf("%d%d",&n,&m)){
solve();
}
return ;
}

HDU 4757 Tree(可持续化字典树,lca)的更多相关文章

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

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

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

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

  3. hdu 1671 Phone List 字典树

    // hdu 1671 Phone List 字典树 // // 题目大意: // // 有一些电话号码的字符串长度最多是10,问是否存在字符串是其它字符串的前缀 // // // 解题思路: // ...

  4. HDU 4757 Tree 可持久化字典树

    Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...

  5. HDU 4557 Tree(可持久化字典树 + LCA)

    http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意: 给出一棵树,每个结点有一个权值,现在有多个询问,每次询问包含x,y,z三个数,求出在x到y的路径上 ...

  6. HDU 4757 Tree(可持久化字典树)(2013 ACM/ICPC Asia Regional Nanjing Online)

    Problem Description   Zero and One are good friends who always have fun with each other. This time, ...

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

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

  8. hdu 1251 统计难题 (字典树入门题)

    /******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...

  9. HDU 5536 Chip Factory 字典树

    Chip Factory Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

随机推荐

  1. Promise 多重链式调用

    Promise对象是用于异步操作的. Promise的真正强大之处在于它的多重链式调用,可以避免层层嵌套回调.如果我们在第一次ajax请求后,还要用它返回的结果再次请求呢? 使用Promise,我们就 ...

  2. IOS下去掉input submit圆角和

    在iOS系统下input submit会有圆角,如果添加有背景色,背景色出错,在安卓系统是没有这些问题,可以在input样式加上这段样式 input{ -webkit-appearance: none ...

  3. GreenPlum 大数据平台--非并行备份(六)

    一,非并行备份(pg_dump) 1) GP依然支持常规的PostgreSQL备份命令pg_dump和pg_dumpall 2) 备份将在Master主机上创建一个包含所有Segment数据的大的备份 ...

  4. 参考美团、饿了么 && localStorage

    localStorage使用.        为什么要使用 localStorage?       因为在之前的讨论过程中,问题:每次添加一件商品和去掉一个商品都需要发送一个http请求来更新购物车, ...

  5. vue生命周期及使用 && 单文件组件下的生命周期

    生命周期钩子 这篇文章主要记录与生命周期相关的问题. 之前,我们讲到过生命周期,如下所示: 根据图示我们很容易理解vue的生命周期: js执行到new Vue() 后,即进入vue的beforeCre ...

  6. flume 自定义sink

    http://flume.apache.org/FlumeDeveloperGuide.html#sink 看了 还是比较好上手的,简单翻译一下 sink的作用是从 Channel 提取 Event  ...

  7. php 中全局变量global 的使用

    简介 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的.一些常见的全局数据有:程序设定类.数 据库连接类.用户资料等等.有很多方法能够使这些数 ...

  8. js 获取时间相关

    $(document).ready(function () {            var date = new Date();            var sb = "";  ...

  9. /Date(1410019200000+0800)/如何转换为date对象

    <script type="text/javascript">var s = '/Date(1410019200000+0800)/ '; s.replace(/Dat ...

  10. oracle OTT 学习

    1.OTT概念 OTT 是 Object Type Translator 的缩写,对象类型转换器.它是用来将数据库中定义的类型(UDT)转换为C结构体类型的工具.借助OTT 可以用C语言调用OCI来访 ...