[hdu 6191] Query on A Tree
Query on A Tree
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)
Total Submission(s): 733 Accepted Submission(s): 275
One day, monkey A learned about one of the bit-operations, xor. He was keen of this interesting operation and wanted to practise it at once.
Monkey A gave a value to each node on the tree. And he was curious about a problem.
The problem is how large the xor result of number x and one node value of label y can be, when giving you a non-negative integer x and a node label u indicates that node y is in the subtree whose root is u(y can be equal to u).
Can you help him?
For each test case there are two positive integers n and q, indicate that the tree has n nodes and you need to answer q queries.
Then two lines follow.
The first line contains n non-negative integers V1,V2,⋯,Vn, indicating the value of node i.
The second line contains n-1 non-negative integers F1,F2,⋯Fn−1, Fi means the father of node i+1.
And then q lines follow.
In the i-th line, there are two integers u and x, indicating that the node you pick should be in the subtree of u, and x has been described in the problem.
2≤n,q≤105
0≤Vi≤109
1≤Fi≤n, the root of the tree is node 1.
1≤u≤n,0≤x≤109
3
网上有用DFS序来做的,但是本蒟蒻并不太清楚他们dalao的做法,所以只是大了一发可持久化trie合并。。
对于这一题,主要涉及trie的合并,要将u的子节点的信息合并到u的身上去。
那么,假设要将v的信息并到u上,则:
int merge(int u,int v) {
if (!u) return v;
if (!v) return u;
ch[u][]=merge(ch[u][],ch[v][]);
ch[u][]=merge(ch[u][],ch[v][]);
return u;
}
那么这题差不多就可以A了。
code:
%:pragma gcc optimize()
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define jug(i,x) (((1<<i)&x)>0)
#define M(a,x) memset(a,x,sizeof a)
using namespace std;
,Nod=;
int n,tot,Q,a[N],lnk[N],nxt[N],son[N];
int ro[N],ans[N];
struct que {int v,i;};
vector <que> qr[N];
struct persistent_trie {
];
;}
int newnode() {
M(ch[cnt],);
return cnt++;
}
int merge(int x,int y) {
if (!x) return y;
if (!y) return x;
ch[x][]=merge(ch[x][],ch[y][]);
ch[x][]=merge(ch[x][],ch[y][]);
return x;
}
void insert(int x,int v) {
int u=ro[x];
; i>=; i--) {
bool c=jug(i,v);
if (!ch[u][c]) ch[u][c]=newnode();
u=ch[u][c];
}
}
int query(int x,int v) {
;
; i>=; i--) {
bool c=jug(i,v);
-c]) ret|=(<<i),u=ch[u][-c];
else u=ch[u][c];
}
return ret;
}
}pt;
inline int read() {
; char ch=getchar();
') ch=getchar();
+ch-',ch=getchar();
return x;
}
void add(int x,int y) {
nxt[++tot]=lnk[x],son[tot]=y,lnk[x]=tot;
}
void DFS(int x) {
ro[x]=pt.newnode();
pt.insert(x,a[x]);
for (int j=lnk[x]; j; j=nxt[j])
DFS(son[j]),ro[x]=pt.merge(ro[x],ro[son[j]]);
,si=qr[x].size(); i<si; i++)
ans[qr[x][i].i]=pt.query(x,qr[x][i].v);
}
int main() {
while (scanf("%d%d",&n,&Q)!=EOF) {
tot=,M(lnk,),M(nxt,),M(ans,),pt.init();
; i<=n; i++) a[i]=read();
; i<n; i++) {
);
}
; i<=n; i++) qr[i].clear();
; i<=Q; i++) {
int x=read(); que now;
now.i=i,now.v=read(),qr[x].push_back(now);
}
DFS();
; i<=Q; i++) printf("%d\n",ans[i]);
}
;
}
[hdu 6191] Query on A Tree的更多相关文章
- 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(可持久化Trie)
题意 \(n\) 个点的有根树,根为 \(1\) .每个点有点权,有 \(q\) 个询问,每次询问以 \(u\) 为根的子树的点的点权中异或 \(x\) 所得的最大值是多少. 思路 求出整棵树的 \( ...
- HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)
题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...
- HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )
题目链接 题意 : 给你一棵树.树上的每个点都有点权.之后有若干次问询.每次问询给出一个节点编号以及一个整数 X .问你以给出节点为根的子树中哪个节点和 X 异或最大.输出这个值 分析 : 看到这种树 ...
- 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 ...
- hdu 4912 Paths on the tree(树链拆分+贪婪)
题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
随机推荐
- JS进阶系列之this (call、apply、bind)
在javascript中,this的指向是在执行上下文的创建阶段确定的,其实只要知道不同执行方式下,this的指向分别是是什么,就能很好的掌握this这个让人摸不透的东西. 一.全局执行 全局执行又分 ...
- python学习 day014打卡 内置函数二&递归函数
本节主要内容: 1.lambda匿名函数 2.sorted() 3.filter() 4.map() 5.递归函数 6.二分法 一.lambda匿名函数 为了解决一些简单的需求而设计的一句话函数 # ...
- 那些年我们一起用过的 PHP 函数(一)
用这个帖子记录一下 PHP 中比较常用的函数以及使用过程中需要注意的点,此贴持续更新 1.strpos() 函数 首先,我们知道 strpos() 函数是用于查找一个字符串在另一个字符串第一次 ...
- 使用v-for循环写入html内容,每一项的数据的写入
项目使用vue.js,在写某个dialog页面时,需要循环后台的数据(班级,班级学生名单,已选学生名单,发布时间,截止时间,答案显示等). 遇到的问题:循环绑定的值是相同的,而且改动一个值,其他ite ...
- 微信小程序--bind 和catch区别
冒泡事件,当点击最里面的事件的时候,外面有事件也会执行,如3>2>1, 点击2时,2>1, 点击 最外层时 1. 1. bind事件 2.catch事件 catch事件是一个单独的 ...
- java io 好文传送
转自:白大虾 地址:https://www.cnblogs.com/baixl/p/4170599.html 主要内容 java.io.File类的使用 IO原理及流的分类 文件流 FileInput ...
- STL_头文件
#include <string> #include <vector> #include <deque> #include <queue> #inclu ...
- A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记
A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK 文章地址:https://ieeex ...
- 离线人脸识别C#类库分享 虹软2.0版本
目前只封装了人脸检测部分的类库,供大家交流学习,肯定有问题,希望大家在阅读使用的时候及时反馈,谢谢!使用虹软技术开发完成 戳这里下载SDKgithub:https://github.com/dayAn ...
- MySQL学习(十一)
MySQL的函数 1 数学函数 2 字符串函数 3 日期和时间函数 4 条件判断函数 5 系统信息函数 6 加密解密函数 7 其他函数 2 字符串函数 length计算的是字节长度 char_leng ...