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 不能解决 ...
随机推荐
- hdu 2255 奔小康赚大钱 最大权匹配KM
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事 ...
- Leetcode#61 Rotate List
原题地址 我一直不太理解为什么叫rotate,翻译成"旋转"吧,似乎也不像啊.比如: 1->2->3->4->5->NULL 向右旋转2的距离,变成了 ...
- 关于Web与JS
Web包含的范围比较广, JS只是代码逻辑而已. Web比如HTTP Message, SOAP Message, 浏览器流程,工具等. 不仅仅是代码.
- ftp命令和scp命令
ftp命令: 服务器有安装ftp Server,另外一台linux可以使用ftp的client程序来进行文件的拷贝读取和下载. 1. 连接ftp服务器 格式:ftp [hostname| ip-ad ...
- Javascript里的那些距离们
1.有滚动条的控件的距离: scrollTop和scrollLeft:分别指有滚动条的容器控件的滚动条的top和left:页面滚动条的通用取法:document.body.scrollTop(FF\C ...
- HDU 1247 Hat’s Words(map,STL,字符处理,string运用)
题目 用map写超便捷 也可以用字典树来写 我以前是用map的: #include<stdio.h> #include<string.h> #include<algori ...
- POJ 1507
#include<iostream> #include<stdio.h> using namespace std; #include<iomanip> double ...
- .Net知识点总结(一)
1.文件上传:Jquery.uploadify 它依赖于flash 舍去起上传 功能 改用SWFupload 他是第三方的插件 2.验证码激活的时候,邮箱开始是写死的,但是为了以后更改邮箱 ...
- AutoCompleteTextView的应用
现在我们上网几乎都会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 里是如何实现的呢? 事实上,Android 的AutoComplete ...
- 2014多校第三场1005 || HDU 4891 The Great Pan(模拟)
题目链接 题意 : 给你n行字符串,问你有多少种理解方式.有两大类的理解 (1){A|B|C|D|...}代表着理解方式可以是A,可以是B或C或者D. (2)$blah blah$,在$$这两个符号中 ...