【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\) 所得的最大值是多少. 思路 求出整棵树的 \( ...
随机推荐
- maven docker plugin 常见问题解决
1. maven 项目必须使用小写,不然会一直有500 的错误 500: HTTP 500InternalServerError 2. docker server 连接数超了 Fail ...
- Docker的主要组件
Docker 的主要组件 安装 docker ,其实是安装了 docker 客户端.dockerd 等一系列的组件,其中比较重要的有下面几个. Docker CLI(docker)docker 程序是 ...
- LNMP.ORG 安装LNMP
参考:http://lnmp.org/install.html cd /usr/local/src wget -c http://soft.vpser.net/lnmp/lnmp1.3-full.ta ...
- ubuntu :安装skype聊天工具
如题,今天就想搞个软件在ubuntu能聊天,查一下skype,好像网上有人说不是每个安装包都用的了,skype-ubuntu-precise_4.2.0.13-1_i386.deb可以, 我在微盘下载 ...
- php 操作提示框
/** * 跳转 * @param type $msg * @param type $url */ protected function jump($msg, $url) { $html = < ...
- Jenkins的pipeline
说明 再官网文档上有说明pipeline的工作流程,具体可以参考pipeline文档和语法文档. 这里将pipeline的生命周期图贴出来 我们暂时不会用到完整的流程,只摘取有用的部分,完成最小的流 ...
- 【JS】手机屏幕旋转判断
function readDeviceOrientation() { if (Math.abs(window.orientation) === 90) { // Landscape alert('横屏 ...
- 在单片机上实现UDP
http://blog.chinaunix.net/uid-18921523-id-260999.html
- 螺旋填数:读入两个整数m,n,输出一个m行n列的矩阵,这个矩阵是1~m*n这些自然数按照右、下、左、上螺旋填入的结果。
package Day8_06; /*读入两个整数m,n,输出一个m行n列的矩阵,这个矩阵是1~m*n这些自然数按照右.下.左.上螺旋填入的结果. * 例如读入数字4,5,则输出结果为: * 1 2 ...
- Java-Runoob-高级编程:Java 网络编程
ylbtech-Java-Runoob-高级编程:Java 网络编程 1.返回顶部 1. Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.n ...