题意:

  给出一个带点权的树。q次询问,每次询问给出u和x,求点u的子树中与x异或的最大值。

题解:

  将询问离线化。

  每颗节点动态建立字典树。每个节点和自己的孩子合并,但是这样会改变子树节点的字典树,所以就在每个节点回溯的时候计算出该节点的答案。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
int n, q;
int tot, num, f;
int w[N];
int root[N];
int head[N], to[N], nxt[N];
int tre[N*40][2];
int u, x;
vector<int> g[N];
vector<int> id[N];
int ans[N];
void build(int id) {scanf("%d", &w[id]);root[id] = ++tot;int c = tot;for(int i = 30; i >= 0; i--) {if(w[id]&(1<<i)) tre[c][1] = ++tot;else tre[c][0] = ++tot;c = tot;}
}
void update(int u, int v) {if(tre[v][0]>0) {if(tre[u][0]==0) tre[u][0] = tre[v][0];else update(tre[u][0], tre[v][0]);}if(tre[v][1]>0) {if(tre[u][1]==0) tre[u][1] = tre[v][1];else update(tre[u][1], tre[v][1]);}
}
int query(int u, int x) {int res = 0;int c = root[u];for(int i = 30; i >= 0; i--) {int p = (x>>i)&1;if(tre[c][p^1] > 0) res |= (1<<i), c = tre[c][p^1];else if(tre[c][p] > 0) c = tre[c][p];}return res;
}
void dfs(int u) {for(int i = head[u]; ~i; i = nxt[i]) {dfs(to[i]);update(root[u], root[to[i]]);}int len = g[u].size();for(int i = 0; i < len; i++) ans[id[u][i]] = query(u, g[u][i]);
}
int main() {while(~scanf("%d%d", &n, &q)) {tot = num = 0;memset(tre, 0, sizeof(tre));memset(head, -1, sizeof(head));for(int i = 1; i <= n; i++) {g[i].clear();id[i].clear();}for(int i = 1; i <= n; i++) build(i);for(int i = 2; i <= n; i++) {scanf("%d", &f);to[++num] = i; nxt[num] = head[f]; head[f] = num;}for(int i = 1; i <= q; i++) {scanf("%d%d", &u, &x);g[u].push_back(x);id[u].push_back(i);}dfs(1);for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);}
}

View Code

转载于:https://www.cnblogs.com/Pneuis/p/9152968.html

HDU - 6191 Query on A Tree相关推荐

  1. HDU - 3804 Query on a tree(主席树维护最大值+离散化)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  2. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

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

  4. SPOJ 375. Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 375. Query on a tree Problem code: QTREE You are given a t ...

  5. XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,每棵树初始权值都为000,现在给你两个操作: (1)(1)(1)将uuu的子树权值全部加111. (2)(2)(2)将(u,v)(u,v)(u,v ...

  6. [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)

    首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 的两个白点间的最长路径 ...

  7. LCA SP913 QTREE2 - Query on a tree II

    SP913 QTREE2 - Query on a tree II 给定一棵n个点的树,边具有边权.要求作以下操作: DIST a b 询问点a至点b路径上的边权之和 KTH a b k 询问点a至点 ...

  8. Query on a tree(LCT版)

    文章目录 题目 分析 代码 题目 Query on a tree 分析 动态树(LCT)初探 代码 #include<cstdio> #include<vector> #inc ...

  9. HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)

    题意: 有一棵n个节点的树,每个节点都有一个值,m次查询,每次两个数x y表示以x为根的子树中哪个节点权值异或y得出的结果最大,求最大结果 离线 和线段树合并一样,在搜索过程中将多个字典树并在一起 每 ...

最新文章

  1. 金山发布《2006年度信息安全报告》
  2. 图解八大排序算法——我见过的最详细的讲解(转)
  3. ios 折线图_《解神者》ios和安卓互通吗 ios和安卓互通分析
  4. CSS3盒子阴影box-shadow
  5. hdu 1147(线段相交)
  6. [转] 前端异常监控解决方案研究
  7. 爱奇艺怎么看不了电视剧和视频
  8. Ubuntu18.04 安装nextcloud
  9. Altera FPGA程序固化
  10. (转)“在证券行业,技术不重要,不要过分强调!”
  11. Gazebo学习笔记4:模型编辑器
  12. Vim配置#pathogen插件管理工具
  13. MySQL limit 2种写法
  14. 前端项目实战59-new URLSearchParams
  15. 中国知网论文查重算法和修改攻略
  16. 计算机组成原理练习题——机器码与加减运算
  17. 计算机网络雨课堂练习11
  18. 锚点链接点击锚点后不改变url的方法
  19. 基于ZigBee的城市道路除尘降温系统设计
  20. 珍大户 认知世界的经济学课程推荐电影《大空头》链接地址及笔记

热门文章

  1. HDU 2686 多线程DP
  2. cocoapods 安装失败 ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension.
  3. 驾校学员驾考成绩管理系统
  4. Redis 中两种持久化机制详解
  5. exchange2010查询用户邮箱配额、设置用户邮箱配置的方法
  6. 决策树之C4.5(详细版终结版)
  7. 连锁百货企业数据系统整理解决方案
  8. 分子排列不同会导致_东华大学《高分子物理》各章选择判断题
  9. python脚本在centos系统一键卸载重新安装Mysql
  10. pycharm设置中文