【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\) 所得的最大值是多少. 思路 求出整棵树的 \( ...
随机推荐
- openresty 使用 log_by_lua 发送日志到 syslog-ng
1. 安装 opm get p0pr0ck5/lua-resty-logger-socket 2. 使用 location lua_by_lua_block log_by_lu ...
- spec.template.spec.initContainers[1].securityContext.privileged: Forbidden: disallowed by policy 问题解决
主要是执行系统特权应用解决方法: api server controller-manager 加上 --allow-privileged=true 即可 之后重启服务
- mysql存储引擎之myisam学习
myisam存储引擎特点:1.不支持事务2.表级锁定(更新时锁整个表,其索引机制是表级索引,这虽然可以让锁定的实现成本很小,但是也同时大大降低 了其并发性能) 3.读写互相阻塞:不仅会在写入的时候阻塞 ...
- 操作系统-服务器-百科:Windows Server
ylbtech-操作系统-服务器-百科:Windows Server Windows Server是微软在2003年4月24日推出的Windows 的服务器操作系统,其核心是Microsoft Win ...
- nginx的编译安装以及启动脚本编写
Nginx的编译安装和启动脚本的编写 Nginxd的功能强大,可以实现代理.负载均衡等企业常用的功能.下面介绍一下nginx的编译安装方法: 1. 下载 官方下载地址:http://nginx.org ...
- HTML5 本地存储 [转]
1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本地客户端程序优于 we ...
- htm标签的语意
标签名 英文全拼 标签语意 div division 分割 span span 范围 ol ordered list 排序列表 ul unordered list 不排序列表 li list item ...
- Vue源码学习(零):内部原理解析
本篇文章是在阅读<剖析 Vue.js 内部运行机制>小册子后总结所得,想要了解详细内容,请参考原文:https://juejin.im/book/5a36661851882538e2259 ...
- Oracle回收站使用全攻略
摘要:回收站(Recycle Bin)从原理上来说就是一个数据字典表,放置用户删除(drop)掉的数据库对象信息.用户进行删除操作的对象并没有被数据库删除,仍然会占用空间.除非是由于用户手工进行Pur ...
- js中Number()、parseInt()和parseFloat()的区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...