题意:询问树上结点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. JDK安装以及maven部署

    JDK安装 检查原有JDK rpm -qa|grep jdk 假如原环境安装有JDK,卸载,命令举例: yum -y remove java--openjdk-headless-.b17.el7.x8 ...

  2. nodejs的一些学习

    要使用npm的时候,其实是可以直接下载node.js的.参考文档http://www.runoob.com/nodejs/nodejs-npm.html 安装成功之后.判断是否安装成功.是不能直接用n ...

  3. html简单布局

    转载:https://jingyan.baidu.com/article/ca41422f7e52831eae99eda2.html

  4. web安全——文件上传

    文件上传本身不是漏洞,但如果文件上传功能的限制出现纰漏,允许了不合法且影响网站安全的文件的上传    可以将不合法且影响网站安全稳定性的文件等内容上传的均为“文件上传漏洞”        黑方将文件上 ...

  5. Mac下Jenkins+SVN+Xcode构建持续导出环境

    1 安装Jenkins Jenkins是基于Java开发的一种持续集成工具.所以呢,要使用Jenkins必须使用先安装JDK. JDK安装 JDK 下载地址 jdk 1.8.png 安装JDK的过程略 ...

  6. zabbix web url监控

    一, web监控 这个监控为通过cookie的值来监控网站是否能正常使用 这里测试环境为bbs网站 二, 配置web监控 01, 创建web监控项 02,配置步骤1 查看数据是否成功 第一查看首页时候 ...

  7. cloudemanager安装时出现ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>问题解决方法(图文详解)

    不多说,直接上干货! 问题详情 查看日志/var/log/cloudera-scm-agent/,得知 解决办法 $> ps -ef | grep supervisord $> kill ...

  8. [转]微信小程序开发(二)图片上传+服务端接收

    本文转自:http://blog.csdn.net/sk719887916/article/details/54312573 文/YXJ 地址:http://blog.csdn.net/sk71988 ...

  9. 如何学习Java?学习Java顺序?

    Java相对于Asp.Net或Asp.Net MVC来讲,入门是比较困难和烦琐的!它不像.Net哪样有安装开发工具就可以跑程序了,不需要配置复杂的运行环境. 推荐的学习Java的学习顺序如下: 一.J ...

  10. OAuth2.0 入门与进阶

     一.基础知识 1.OAuth产生背景 很多网站.APP 弱化甚至没有搭建自己的账号体系,而是直接使用社会化登录的方式,这样不仅免去了用户注册账号的麻烦.还可以获取用户的好友关系来增强自身的社交功能. ...