HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )
题意 : 给你一棵树、树上的每个点都有点权、之后有若干次问询、每次问询给出一个节点编号以及一个整数 X 、问你以给出节点为根的子树中哪个节点和 X 异或最大、输出这个值
分析 :
看到这种树上异或最值的问题
可以考虑使用 Trie 来解决
首先涉及到子树
我们可以利用 DFS 序来构造出每个根的子树
DFS 序有很好的性质、其子树的所有节点必定是序列中连续的一段
那么我们就可以对这个 DFS 序列建立可持久化 Trie
然后通过类似前缀和减法的方式得到问询节点子树表示的区间中
所有数组成的 Trie 、然后通过贪心的方法来得到最大异或值
#include<bits/stdc++.h>
using namespace std;
;
);
int root[maxn];
int sz[maxNode];
];
;
int newNode()
{
totNode++;
memset(ch[totNode], , sizeof(ch[totNode]));
sz[totNode] = ;
return totNode;
}
inline void Insert(int F, int C, int val)
{
F = root[F], C = root[C];
; i>=; i--){
;
if(!ch[C][bit]){
ch[C][bit] = newNode();
ch[C][!bit] = ch[F][!bit];
sz[ ch[C][bit] ] = sz[ ch[F][bit] ];
}
C = ch[C][bit], F = ch[F][bit];
sz[C]++;
}
}
int Query(int x, int y, int val)
{
;
; i>=; i--){
;
)
ret += (<<i),
y = ch[y][!c],
x = ch[x][!c];
else x = ch[x][c], y = ch[y][c];
}
return ret;
}
struct EDGE{ int v, w, nxt; }Edge[maxn];
;
int weight[maxn];
inline void Edge_init(int n)
{
memset(sz, , sizeof(sz));
memset(ch, , sizeof(ch));
memset(Head, -, sizeof(Head));
EdgeCnt = ;
}
inline void AddEdge(int From, int To, int Weight)
{
Edge[EdgeCnt].v = To;
Edge[EdgeCnt].w = Weight;
Edge[EdgeCnt].nxt = Head[From];
Head[From] = EdgeCnt++;
}
;
int st[maxn], en[maxn];
void DFS(int v)
{
st[v] = squLen;
squ[squLen++] = v;
; i=Edge[i].nxt){
int Eiv = Edge[i].v;
DFS(Eiv);
}
en[v] = squLen-;
}
int main(void)
{
int n, q;
while(~scanf("%d %d", &n, &q)){
squLen = ;
totNode = ;
Edge_init(n);
; i<=n; i++) scanf("%d", &weight[i]);
; i<=n-; i++){
int Fa; scanf("%d", &Fa);
AddEdge(Fa, i+, weight[i]);
}
DFS();
root[] = ch[][] = ch[][] = ;
; i<squLen; i++) root[i] = newNode();
; i<squLen; i++)
Insert(i-, i, weight[squ[i]]);
while(q--){
int v, x;
scanf("%d %d", &v, &x);
printf(, en[v], x));
}
}
;
}
HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )的更多相关文章
- 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(可持久化Trie)
题意 \(n\) 个点的有根树,根为 \(1\) .每个点有点权,有 \(q\) 个询问,每次询问以 \(u\) 为根的子树的点的点权中异或 \(x\) 所得的最大值是多少. 思路 求出整棵树的 \( ...
- HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)
题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...
- 2017广西邀请赛 Query on A Tree (可持续化字典树)
Query on A Tree 时间限制: 8 Sec 内存限制: 512 MB提交: 15 解决: 3[提交][状态][讨论版] 题目描述 Monkey A lives on a tree. H ...
- 2017ACM/ICPC广西邀请赛-重现赛
HDU 6188 Duizi and Shunzi 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 思路: 签到题,以前写的. 实现代码: #inc ...
- S - Query on a tree HDU - 3804 线段树+dfs序
S - Query on a tree HDU - 3804 离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...
- hdu 4836 The Query on the Tree(线段树or树状数组)
The Query on the Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
随机推荐
- Mysql优化深度解析
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...
- 2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)
我是傻逼我是傻逼 #include<bits/stdc++.h> using namespace std; const int maxn=4e5+50; typedef long long ...
- 关闭mysql查询缓存query cache(用户测试性能)
先对query cache进行查询 mysql> show global variables like '%cache%'; 查看query_cache_size.query_cache_typ ...
- 使用git保存管理代码
1.git是个代码版本管理软件,类似SVN github是个网站,提供git服务,我们只需要注册个账号,就可以使用它的git服务,不需要自己部署git系统 git需要先在电脑端安装,安装完成后,讲产生 ...
- Threadlocal线程本地变量理解
转载:https://www.cnblogs.com/chengxiao/p/6152824.html 总结: 作用:ThreadLocal 线程本地变量,可用于分布式项目的日志追踪 用法:在切面中生 ...
- Codeforces 1190A. Tokitsukaze and Discard Items
传送门 显然从左到右考虑每个要删除的数 维护一个 $cnt$ 表示之前已经删除了 $cnt$ 个数,那么当前所有要删除数的实际位置就要减去 $cnt$ 直接暴力枚举哪些数在最左边一个块然后一起删除 每 ...
- Git复习(七)之自定义git、忽略特殊文件、配置文件
前言 config 配置有system级别(系统级别). global(用户级别).local(当前仓库)三个 设置先从system->global->local 底层配置会覆盖顶层配置 ...
- qt treaview项checkbox样式
QTreeView::indicator:enabled:checked { /** 指示器 - 选中 **/ image: url(yzfx/checkbox_checked.png);}QTree ...
- 关于redis的几件小事(十)redis cluster模式
redis cluster是redis提供的集群模式. 1.redis cluster的架构 ①可以有多个master node,每个master node 都可以挂载多个slave node. ②读 ...
- python的加密方式
MD5加密 这是一种使用非常广泛的加密方式,不可逆的,在日常字符串加密中经常会用到,下面我简单介绍一下这种方式,主要用到Python自带的模块hashlib,测试代码如下,先创建一个md5对象,然后直 ...