HDU 4757 Tree(可持久化trie)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757
题意:给出一棵树,节点有权值。每次询问x到y的路径上与z抑或的最大值。
思路:可持久化trie。
struct Node
{
int c[2],cnt;
};
Node a[2000005];
int cnt;
int newNode()
{
cnt++;
a[cnt].c[0]=a[cnt].c[1]=a[cnt].cnt=0;
return cnt;
}
struct node
{
int v,next;
};
node edges[N<<1];
int head[N],e;
void add(int u,int v)
{
edges[e].v=v;
edges[e].next=head[u];
head[u]=e++;
}
int n,m,f[N][20],d[N],dep[N],root[N];
void insert(int u,int p,int d)
{
int x=root[u],y=root[p],i,k;
for(i=15;i>=0;i--)
{
k=(d>>i)&1;
a[x].c[k]=newNode();
a[x].c[!k]=a[y].c[!k];
a[a[x].c[k]].cnt=a[a[y].c[k]].cnt+1;
x=a[x].c[k];
y=a[y].c[k];
}
}
void DFS(int u,int pre)
{
f[u][0]=pre; dep[u]=dep[pre]+1;
root[u]=newNode();
insert(u,pre,d[u]);
int i,v;
for(i=head[u];i!=-1;i=edges[i].next)
{
v=edges[i].v;
if(v==pre) continue;
DFS(v,u);
}
}
int getLca(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
int i,k=dep[y]-dep[x];
FOR0(i,16) if(k&(1<<i)) y=f[y][i];
if(x==y) return x;
for(i=16;i>=0;i--)
{
if(f[x][i]&&f[y][i]&&f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int cal(int x,int y,int z,int val)
{
int i,k,ans=0,t=f[z][0];
x=root[x];
y=root[y];
z=root[z];
t=root[t];
for(i=15;i>=0;i--)
{
k=!((val>>i)&1);
int xx=a[x].c[k];
int yy=a[y].c[k];
int zz=a[z].c[k];
int tt=a[t].c[k];
if(a[xx].cnt+a[yy].cnt-a[zz].cnt-a[tt].cnt>0) ans|=1<<i;
else k=!k;
x=a[x].c[k];
y=a[y].c[k];
z=a[z].c[k];
t=a[t].c[k];
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
int i;
FOR1(i,n) RD(d[i]),head[i]=-1;
cnt=0; e=0;
FOR1(i,n-1)
{
int u,v;
RD(u,v);
add(u,v); add(v,u);
}
clr(f,0);
DFS(1,0);
int j;
for(i=1;i<=16;i++) FOR1(j,n)
{
f[j][i]=f[f[j][i-1]][i-1];
}
while(m--)
{
int x,y,z;
RD(x,y,z);
PR(cal(x,y,getLca(x,y),z));
}
}
}
HDU 4757 Tree(可持久化trie)的更多相关文章
- HDU.4757.Tree(可持久化Trie)
题目链接 \(Description\) 给定一棵树,点有点权.\(Q\)次询问\(x,y,z\),求\(x\)到\(y\)的简单路径中,与\(z\)异或能得到的最大的数是多少. \(Solution ...
- HDU 4757 Tree 可持久化字典树 trie
http://acm.hdu.edu.cn/showproblem.php?pid=4757 给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 v ...
- 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+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: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Prob ...
- 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, ...
- HDU4757 Tree(可持久化Trie)
写过可持久化线段树,但是从来没写过可持久化的Trie,今天补一补. 题目就是典型的给你一个数x,和一个数集,问x和里面的某个数xor起来的最大值是多少. 最原始的是数集是固定的,只需要对数集按照高到低 ...
- HDU 4757 Tree(可持续化字典树,lca)
题意:询问树上结点x到结点y路上上的权值异或z的最大值. 任意结点权值 ≤ 2^16,可以想到用字典树. 但是因为是询问某条路径上的字典树,将字典树可持续化,字典树上的结点保存在这条路径上的二进制数. ...
- 可持久化Trie模板
如果你了解过 01 Trie 和 可持久化线段树(例如 : 主席树 ).那么就比较好去可持久化 Trie 可持久化 Trie 当 01 Trie 用的时候能很方便解决一些原本 01 Trie 不能解决 ...
随机推荐
- c# 简单文件流读写CSV文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- DSP中常用的C语言关键字
const Ø使用:const 数据类型 变量名: Ø作用:优化存储器的分配,表示变量的内容是常数,不会改变. Ø举例:const char tab[1024]={显示数据}; volatile(易变 ...
- LUCAS 定理
原来一张图就就能证明:C(N,M)%P,p是素数. 简直太炫酷 先膜拜会 #include<iostream>#include<cstdio>#include<ctime ...
- topcoder 643 DIV2
太弱了,太弱了! A:基本的判断吧,然后就是边界问题,写了好久,结果发现时房间第二个交的.. B:真心跪了,还好想出来了,思路想的太慢太慢,结果交上去,落后太多,不过HACK时很多人挂了, 这也是DI ...
- HTTP message vs SOAP message
HTTP Message / SOAP Message HTTP Message ===>包括Request, Response.我们主要关注的是 HTTP Message,这样子包含的范围会更 ...
- SQL分页查询总结{转}
开发过程中经常遇到分页的需求,今天在此总结一下吧.简单说来方法有两种,一种在源上控制,一种在端上控制.源上控制把分页逻辑放在SQL层:端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridVie ...
- vim使用指北 ---- Advanced Editing
本节介绍vi和ex的一些高级功能. 配置vi 配置文件.exrc可以保存在你的主目录下,在vi启动的时候执行这个配置文件.但在当前工作目录下可以放置一个配置文件,对当前目录做一个自定义配置. :set ...
- POJ 2080
import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...
- Android中的Adapter总结
一.Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for t ...
- 机器学习之逻辑回归(Logistic Regression)
1. Classification 这篇文章我们来讨论分类问题(classification problems),也就是说你想预测的变量 y 是一个离散的值.我们会使用逻辑回归算法来解决分类问题. 之 ...