【HDU 6191】Query on A Tree 【可持久化字典树】
题目
给出一棵有n个结点的树,树根是1,每个结点给出一个value。然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这个最大值
分析
显而易见的可持久化字典树,只不过这次每次查询不是查询一个区间,而是查询一棵子树。那么也很简单,我们只要预处理出dfs序然后找出每个结点以它为根的子树在dfs序中的区间。然后以这个区间建可持久化字典树就可以了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
const int maxn=+;
int val[maxn];
int head[maxn],to[maxn],Next[maxn];
int n,q,sz;
void add_edge(int a,int b){
++sz;
to[sz]=b;Next[sz]=head[a];head[a]=sz;
}
int order[maxn],L[maxn],R[maxn],num;
void dfs(int u,int fa){
num++;
order[num]=val[u];
L[u]=num;
for(int i=head[u];i!=-;i=Next[i]){
int v=to[i];
if(v!=fa)
dfs(v,u);
}
R[u]=num;
}
int ch[maxn**][],root[maxn],sum[maxn**][],cnt,val_t[*maxn*];
void update(int x,int y,int a,int ID){
root[x]=++cnt;x=root[x];
for(int i=;i>=;i--){
int id=(a>>i)&;
sum[x][id]+=sum[y][id]+;
sum[x][!id]+=sum[y][!id];
ch[x][!id]=ch[y][!id];
ch[x][id]=++cnt;
memset(ch[cnt],,sizeof(ch[cnt]));
val_t[cnt]=;
x=ch[x][id];y=ch[y][id];
}
val_t[x]=ID;
}
int query(int x,int y,int a){
for(int i=;i>=;i--){
int id=(a>>i)&;
if(sum[x][!id]-sum[y][!id]){
x=ch[x][!id],y=ch[y][!id];
}else{
x=ch[x][id],y=ch[y][id];
}
}
return val_t[x];
}
int main(){
while(scanf("%d%d",&n,&q)!=EOF){
sz=;
cnt=;
memset(head,-,sizeof(head));
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++){
scanf("%d",&val[i]);
}
for(int i=;i<=n;i++){
int a;
scanf("%d",&a);
add_edge(a,i);
}
num=;
dfs(,-);
// for(int i=1;i<=n;i++)
// printf("%d ",order[i]);
// printf("\n");
update(,,,);
for(int i=;i<=n;i++){
update(i,root[i-],order[i],i);
}
int u,x;
for(int i=;i<=q;i++){
scanf("%d%d",&u,&x);
printf("%d\n",order[query(root[R[u]],root[L[u]-],x)]^x);
}
}
return ;
}
【HDU 6191】Query on A Tree 【可持久化字典树】的更多相关文章
- HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)
题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...
- 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(可持久化字典树+lca)
题目链接:点这 我的github地址:点这 Problem Description Zero and One are good friends who always have fun wi ...
- HDU 6191 Query on A Tree(可持久化Trie+DFS序)
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- [hdu 6191] Query on A Tree
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- HDU 6191 Query on A Tree(字典树+离线)
Query on A Tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Othe ...
- hdu 6191--Query on A Tree(持久化字典树)
题目链接 Problem Description Monkey A lives on a tree, he always plays on this tree. One day, monkey A l ...
- HDU 4757 Tree 可持久化字典树 trie
http://acm.hdu.edu.cn/showproblem.php?pid=4757 给出一棵树,每个节点有权值,每次查询节点 (u,v) 以及 val,问 u 到 v 路径上的某个节点与 v ...
- 2017广西邀请赛 Query on A Tree (可持续化字典树)
Query on A Tree 时间限制: 8 Sec 内存限制: 512 MB提交: 15 解决: 3[提交][状态][讨论版] 题目描述 Monkey A lives on a tree. H ...
- HDU 6191 Query on A Tree(可持久化Trie)
题意 \(n\) 个点的有根树,根为 \(1\) .每个点有点权,有 \(q\) 个询问,每次询问以 \(u\) 为根的子树的点的点权中异或 \(x\) 所得的最大值是多少. 思路 求出整棵树的 \( ...
随机推荐
- 系列文章--一步一步学Silverlight2
概述 由TerryLee编写的<Silverlight 2完美征程>一书,已经上市,在该系列文章的基础上补充了大量的内容,敬请关注.官方网站:http://www.dotneteye.cn ...
- (四)、Fiddler打断点
一.打断点是Fiddler一个比较好用的功能,它可以做一些手工操作很难做的事情. 那为什么要打断点? 看下图,Fiddler打开后,Client(客户端)发送的请求会先经过Fiddler,然后Fidd ...
- Android 操作文件系统失败: Read-only file system
现象: $ adb push /d/Aaron/Desktop/libreference-ril-LS.so system/lib failed to copy 'D:/Aaron/Desktop/l ...
- 微服务架构 vs. SOA架构
面向服务架构(SOA)已经存在有些年头了,这是一种用于设计软件的伟大原则.在SOA中,所有组件都是独立自主的,并能为其他组件提供服务.要替换掉系统中的某些部分而不对整个系统造成较大的影响本是个难题,然 ...
- spring面试资料
* Spring的优点有什么? 1. Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分 2. Spring是POJO编程,POJO编程使得可持续构建和可测试能力提高 ...
- maven中项目发布jar包不同步
昨天的项目今天运行的时候突然发现今天就不能运行了 严重: Error configuring application listener of class org.springframework.web ...
- SpringMVC-Spring-Hibernate项目搭建之一-- 搭建maven 项目 & servlet的demo
一. 搭建maven项目 1. 新建maven项目,选择maven Project --> Next 2. 勾选 Create a simple project --> Next 3. ...
- 如何利用JConsole观察分析Java程序的运行并进行排错调优_java
如何利用JConsole观察分析Java程序的运行并进行排错调优_java 官方指导 use jconsole use jmx technology
- hadoop从调整GC到关键Counter计算原理分析
hadoop集群中发现使用Parallel Scavenge+Parallel Old收集器组合进行垃圾收集(这也是server端jvm默认的GC方式)时CPU占用可能会非常高,偶尔会出现爆满的状态 ...
- 使用 Windows 运行时中异步性来始终保持应用程序能够快速流畅地运行
转自:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/26/windows.aspx 人类的思维方式在本质上不是同步的,这直接影响着我 ...