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

Problem Description
Monkey A lives on a tree, he always plays on this tree.

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?

 
Input
There are no more than 6 test cases.

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

 
Output
For each query, just print an integer in a line indicating the largest result.
 
Sample Input
2 2
1 2
1
1 3
2 1
 
Sample Output
2
3
 
Source
 

显然,又是data structure。。。

网上有用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的更多相关文章

  1. 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 ...

  2. HDU 6191 Query on A Tree(字典树+离线)

    Query on A Tree Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Othe ...

  3. HDU 6191 Query on A Tree(可持久化Trie)

    题意 \(n\) 个点的有根树,根为 \(1\) .每个点有点权,有 \(q\) 个询问,每次询问以 \(u\) 为根的子树的点的点权中异或 \(x\) 所得的最大值是多少. 思路 求出整棵树的 \( ...

  4. HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)

    题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...

  5. HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )

    题目链接 题意 : 给你一棵树.树上的每个点都有点权.之后有若干次问询.每次问询给出一个节点编号以及一个整数 X .问你以给出节点为根的子树中哪个节点和 X 异或最大.输出这个值 分析 : 看到这种树 ...

  6. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  7. 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 ...

  8. hdu 4912 Paths on the tree(树链拆分+贪婪)

    题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...

  9. Query on a tree——树链剖分整理

    树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...

随机推荐

  1. 17秋 SDN课程 第二次上机作业

    1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 3.利用字符界面下发 ...

  2. 【译】第18节---数据注解-ForeignKey

    原文:http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-fi ...

  3. C# 委托例子

    两个子窗口向一个主窗口发送信息 主窗口: using System; using System.Collections.Generic; using System.ComponentModel; us ...

  4. git pull 提示 There is no tracking information for the current branch

    在执行git pull的时候,提示当前branch没有跟踪信息: git pull There is no tracking information for the current branch. P ...

  5. QT使用QJson生成解析Json数据的方法

    QT中使用json还是比较方便的,下面用例子直接说明 举例子之前首先推荐一个在线解析json格式的网站,具体格式用法如下图所示: 之后根据这个格式进行json数据解析. QT使用json需要包含的头文 ...

  6. React Native的键盘遮挡问题(input/webview里)

    2017-06-15 1:使用keyVoaidView来解决 注意要设置behavio=“absolute”,哎.记性差 好像拼错了 2:使用下面的代码,监听键盘,然后将webView拉高就可以了 i ...

  7. JavaSE习题 第四章 类与对象

    问答题: 1.在声明类时,类名应该遵守哪些习惯? 1.与文件名相同2.首字母大写 2.类体内容中有那两类比较重要的成员? 1.成员变量2.方法 3.实例方法可以操作类变量吗?类方法可以操作实例变量吗? ...

  8. ajax操作json的三种方式

    一. 什么是json? 1. JSON是一种轻量级的数据交换格式 2. JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在 ...

  9. js_计时器之setInterval

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. sass、less是什么,如何使用?

    一个很好的介绍的SASS,LESS的区别的文档,值get 1.背景介绍 CSS 是一门非程序式语言,没有变量.函数.SCOPE(作用域),需要书写大量看似没有逻辑的代码,不方便维护及扩 展,不利于复用 ...