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 ...
随机推荐
- PDF技术(四)-Java实现Html转PDF文件
html转换为pdf的关键技术是如何处理网页中复杂的css样式.以及中文乱码处理. 各实现对比表于Windows平台进行测试: 基于IText 基于FlyingSaucer 基于WKHtmlToPdf ...
- Logger Rate Limiter
Design a logger system that receive stream of messages along with its timestamps, each message shoul ...
- Fiddler-打断点(bpu)
一.断点 1.为什么要打断点? 比如一个购买的金额输入框,输入框前端做了限制大于100,那么我们测试的时候,需要测试小于100的情况下.很显然前端只能输入大于100的.这时我们可以先抓到接口,修改请求 ...
- jquery的offset().top与javascript的offsetTop区别?
offset().top是jquery的方法,需引入jquery,它获取你绑定元素上边框相对于html上边界的偏移量 offsetTop是原生js的方法,它获取你绑定元素上边框相对于离自己最近且pos ...
- 协程+IO切换+小爬虫
from gevent import monkeymonkey.patch_all() import geventimport requests def f1(url): print(f'GET:{u ...
- Windows Runtime (RT)
学了sl for wp 开发了1年都没入门,只能说自己的学习欲望太低了. 今天偶然才发现wrt 跟 .net 是2个东西... orz. 得抛弃 sl ,wrt才是未来的主流吧... 这篇文章不错 h ...
- redis 学习(6)-- 集合类型
redis 学习(6)-- 集合类型 set 结构 无序 无重复 集合间操作 set 集合内操作 命令 含义 sadd key memebr1 [member2...] 向集合中添加一个或多个成员 s ...
- innodb中一颗B+树能存储多少条数据
如图,为B+树组织数据的方式: 实际存储时当然不会每个节点只存3条数据. 以InnoDB引擎为例,简单计算一下一颗B+树可以存放多少行数据. B+树特点:只有叶子节点存储数据,而非叶子节点存放的是用来 ...
- JS代码格式化
JS代码格式化也就是规范化,保留必要的换行和缩进使代码阅读起来更容易.团队协同工作时会有相应的标准,大家要保证统一的代码风格,这样在合并代码的时候才不容易出问题.通过快捷键Ctrl+Shift+F进行 ...
- 多线程编程-- part 9 信号量:Semaphore
Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可:当信号量 ...