HDU 4757 Tree
Tree
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)
The first line contains two integers $n$ ($1\le n \le 10^{5}$) and $m$ ($1 \le m \le 10^{5}$), which are the amount of tree’s nodes and queries, respectively.
The second line contains $n$ integers $a_1, a_2, \dots, a_n$ and $a_i$ ($0 \le a_i <2^{16}$) is the value on the $i$th node.
The next $n–1$ lines contains two integers $u, v$, which means there is an edge between $u$ and $v$.
The next $m$ lines contains three integers $x ,y, z$, which are the parameters of Zero’s query.
Solution
Implementation
#include <bits/stdc++.h>
using namespace std; const int M{<<}, N{<<}; int a[N], nxt[M][], cnt[M], tail, root[N];
vector<int> g[N]; //a NULL NODE
//The empty tree is a well-defined tree! int Insert(int id, int v, int dep){ //this node is going to be modified
//always copy before modification
int cur=tail++;
cnt[cur]=cnt[id]+;
if(dep>=)
if(v&<<dep){
nxt[cur][]=nxt[id][];
nxt[cur][]=Insert(nxt[id][], v, dep-);
}
else{
nxt[cur][]=Insert(nxt[id][], v, dep-);
nxt[cur][]=nxt[id][];
}
else nxt[cur][]=nxt[cur][]=; //error-prone return cur;
} int fa[N][], dep[N]; void dfs(int u, int f){
fa[u][]=f, dep[u]=dep[f]+;
for(int i=; i<; i++)
fa[u][i]=fa[fa[u][i-]][i-]; root[u]=Insert(root[f], a[u], );
for(auto x:g[u])
if(x!=f)
dfs(x, u);
} int get_lca(int u, int v){
if(dep[u]<dep[v]) swap(u, v);
int diff=dep[u]-dep[v];
for(int i=; i<; i++)
if(diff&<<i) u=fa[u][i];
if(u==v) return u;
for(int i=; i>=; i--) //error-prone
if(fa[u][i]!=fa[v][i])
u=fa[u][i], v=fa[v][i];
return fa[u][];
} //keep it simple
int query(int u, int v, int x){
int res=, lca=get_lca(u, v);
int _u=root[u], _v=root[v], _w=root[lca]; for(int i=; i>=; i--){
bool f=!(x&<<i);
//check if this bit valid
if(cnt[nxt[_u][f]]+cnt[nxt[_v][f]]>cnt[nxt[_w][f]]<<) res|=<<i;
else f=!f;
_u=nxt[_u][f], _v=nxt[_v][f], _w=nxt[_w][f];
}
return max(res, x^a[lca]);
} int main(){
for(int n, m; cin>>n>>m; ){
for(int i=; i<=n; i++){
scanf("%d", a+i);
g[i].clear();
}
for(int u, v, i=; i<n; i++){
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
//construct an empty tree
root[]=tail=, memset(nxt[tail], , sizeof(nxt[tail])), cnt[tail]=, tail++; dfs(, );
for(int u, v, x, lca; m--; ){
scanf("%d%d%d", &u, &v, &x);
printf("%d\n", query(u, v, x));
}
}
}
HDU 4757 Tree的更多相关文章
- HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)
Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Total Su ...
- HDU 4757 Tree 可持久化字典树
Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...
- HDU 4757 Tree(可持久化trie)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意:给出一棵树,节点有权值.每次询问x到y的路径上与z抑或的最大值. 思路:可持久化trie. ...
- HDU 4757 Tree 可持久化字典树 trie
http://acm.hdu.edu.cn/showproblem.php?pid=4757 给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 v ...
- HDU 4757 Tree(可持续化字典树,lca)
题意:询问树上结点x到结点y路上上的权值异或z的最大值. 任意结点权值 ≤ 2^16,可以想到用字典树. 但是因为是询问某条路径上的字典树,将字典树可持续化,字典树上的结点保存在这条路径上的二进制数. ...
- 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, ...
- HDU.4757.Tree(可持久化Trie)
题目链接 \(Description\) 给定一棵树,点有点权.\(Q\)次询问\(x,y,z\),求\(x\)到\(y\)的简单路径中,与\(z\)异或能得到的最大的数是多少. \(Solution ...
- hdu 5909 Tree Cutting [树形DP fwt]
hdu 5909 Tree Cutting 题意:一颗无根树,每个点有权值,连通子树的权值为异或和,求异或和为[0,m)的方案数 \(f[i][j]\)表示子树i中经过i的连通子树异或和为j的方案数 ...
- HDU 5044 Tree(树链剖分)
HDU 5044 Tree field=problem&key=2014+ACM%2FICPC+Asia+Regional+Shanghai+Online&source=1&s ...
随机推荐
- ios蓝牙开发(三)ios连接外设的代码实现:手机app去读写蓝牙设备。
手机app去读写蓝牙设备....... 代码下载: 原文博客主提供Github代码连接,地址是:https://github.com/coolnameismy/demo ios连接外设的代码实现流程: ...
- 你的C#代码是怎么跑起来的(二)
接上篇:你的C#代码是怎么跑起来的(一) 通过上篇文章知道了EXE文件的结构,现在来看看双击后是怎样运行的: 双击文件后OS Loader加载PE文件并解析,在PE Optional Header里找 ...
- Android反编译工具的使用-Android Killer
今天百度搜索“Android反编译”搜索出来的结果大多数都是比较传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比较方便操作的Android反编译.在这,我将使 ...
- BGP--边界网关协议
要全面了解BGP,首先我们要回答以下看上去很简单的问题:为什么需要BGP,也就是说BGP是如何产生的,它解决了什么问题.带着以上问题,我们先简单的回顾一个路由协议发展的轨迹. 首先路由的实质是描述一个 ...
- mac搭建mamp环境
1 先安装homebrew; 执行:cd /usr/local; 非root用户执行: ruby -e "$(curl -fsSL https://raw.githubusercontent ...
- 12-rm 命令总结
rm remove files or directories 删除目录或文件 [语法]: rm [选项] [参数] [功能介绍] rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其 ...
- restFull常用注解
@GET.@POST.@PUT.@DELETE.@HEAD您可以使用它们来绑定根资源或子资源内的 Java 方法与 HTTP 请求方法.HTTP GET 请求被映射到由 @GET 注释的方法,以此类推 ...
- [Google Guava]学习--新集合类型Multiset
Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关.Multiset继承于JDK的Cllection接口,而不是Set接口. Multiset主要方法介绍: a ...
- 【BZOJ 3053】The Closest M Points
KDTree模板,在m维空间中找最近的k个点,用的是欧几里德距离. 理解了好久,昨晚始终不明白那些“估价函数”,后来才知道分情况讨论,≤k还是=k,在当前这一维度距离过线还是不过线,过线则要继续搜索另 ...
- JAVA程序员一定知道的优秀第三方库(2016版)
几乎每个程序员都知道要“避免重复发明轮子”的道理——尽可能使用那些优秀的第三方框架或库,但当真正进入开发时,我却经常发现他们有时并不知道那些轮子在哪里.最近,我在业余时间带几个年轻的程序员一起做了一个 ...