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 ...
随机推荐
- 【深圳】OSC源创会第44期 开始报名
时间:2016-03-19 14:00 地点: 深圳 南山区海德三道天利中央商务广场B座负一楼(意启创业) 费用:50元/人(现场交),女士.50积分的账号.开源软件作者.学生免费 (用于准备茶歇小食 ...
- 跟我学习Storm_Storm基本架构
Storm集群类似于一个Hadoop集群. 然而你在Hadoop的运行“MapReduce job”,在Storm上你运行 “topologies”. “job”和“topologies”本身有很大的 ...
- JavaScript中call,apply,bind方法的总结。
why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...
- ContentProvider备份短信,以xml文件存储
因为短信的内容已经通过ContentProvider暴露出来,所以我们可以直接用内容解析者获取短信内容. 想要获取短信内容,你需要知道的一些东西: 1.Uri uri = Uri.parse(&quo ...
- fstream 中判断是否成功打开文件
from: http://blog.csdn.NET/zhtsuc/article/details/2938614 关于C++ fstream的一个容易使用出错的地方 关于c++ 中 文件流的两个类, ...
- Maven的内置变量
Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...
- __getattr__与__getattribute__
class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print("执行的是我----->&qu ...
- 安卓 Context 和 Application的关系
1. 我开始一直不理解显式Intent中传一个this(当前的activity)是为什么.因为Intent里面的构造方法对应的只有 Context, Class.后面查资料才发现 Intent i = ...
- 在无修改权限的情况下修改文件hosts中的内容
今天遇到了一个问题,本来希望修改hosts中的内容,但保存时被告知无权限,网上搜索有很多方法都无效,最后搜到一个简单的方法:将hosts文件复制到桌面上,修改,然后覆盖原来位置的hosts文件即可!
- 【BZOJ 2301】【HAOI 2011】Problem b
今天才知道莫比乌斯反演还可以这样:$$F(n)=\sum_{n|d}f(d) \Rightarrow f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)$$我好弱,,,对于$$F( ...