HDU - 6191 Query on A Tree
题意:
给出一个带点权的树。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相关推荐
- HDU - 3804 Query on a tree(主席树维护最大值+离散化)
题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...
- HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)
题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...
- 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 ...
- 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 ...
- 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 ...
- [BZOJ1095][ZJOI2007]捉迷藏 Query on a tree IV(树链剖分)
首先,我们求出树的重链,然后对于每一条链,建一颗线段树 树大概长这样: (其中用红边连起来的是一条条重链) 在线段树上,我们维护: Opt(u):经过 u节点代表的链的其中一段 的两个白点间的最长路径 ...
- 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至点 ...
- Query on a tree(LCT版)
文章目录 题目 分析 代码 题目 Query on a tree 分析 动态树(LCT)初探 代码 #include<cstdio> #include<vector> #inc ...
- HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)
题意: 有一棵n个节点的树,每个节点都有一个值,m次查询,每次两个数x y表示以x为根的子树中哪个节点权值异或y得出的结果最大,求最大结果 离线 和线段树合并一样,在搜索过程中将多个字典树并在一起 每 ...
最新文章
- 金山发布《2006年度信息安全报告》
- 图解八大排序算法——我见过的最详细的讲解(转)
- ios 折线图_《解神者》ios和安卓互通吗 ios和安卓互通分析
- CSS3盒子阴影box-shadow
- hdu 1147(线段相交)
- [转] 前端异常监控解决方案研究
- 爱奇艺怎么看不了电视剧和视频
- Ubuntu18.04 安装nextcloud
- Altera FPGA程序固化
- (转)“在证券行业,技术不重要,不要过分强调!”
- Gazebo学习笔记4:模型编辑器
- Vim配置#pathogen插件管理工具
- MySQL limit 2种写法
- 前端项目实战59-new URLSearchParams
- 中国知网论文查重算法和修改攻略
- 计算机组成原理练习题——机器码与加减运算
- 计算机网络雨课堂练习11
- 锚点链接点击锚点后不改变url的方法
- 基于ZigBee的城市道路除尘降温系统设计
- 珍大户 认知世界的经济学课程推荐电影《大空头》链接地址及笔记
热门文章
- HDU 2686 多线程DP
- cocoapods 安装失败 ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension.
- 驾校学员驾考成绩管理系统
- Redis 中两种持久化机制详解
- exchange2010查询用户邮箱配额、设置用户邮箱配置的方法
- 决策树之C4.5(详细版终结版)
- 连锁百货企业数据系统整理解决方案
- 分子排列不同会导致_东华大学《高分子物理》各章选择判断题
- python脚本在centos系统一键卸载重新安装Mysql
- pycharm设置中文