HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)
题意:
有一棵n个节点的树,每个节点都有一个值,m次查询,每次两个数x y表示以x为根的子树中哪个节点权值异或y得出的结果最大,求最大结果
离线
和线段树合并一样,在搜索过程中将多个字典树并在一起
每次查询遍历以当前子树的根为根的字典树
01字典树:http://blog.csdn.net/jaihk662/article/details/53914904
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<vector>
#include<string.h>
#include<stdlib.h>
using namespace std;
typedef struct
{int x;int id;
}Res;
Res temp;
typedef struct Trie
{Trie *next[2];
}Trie;
vector<int> G[100001];
vector<Res> Q[100001];
int val[100001], ans[100001];
Trie *root[100001];
void Update(Trie *q, int a)
{int i, now;Trie *p = q;for(i=29;i>=0;i--){now = 0;if(a&(1<<i))now = 1;if(p->next[now]==NULL){Trie *temp = new Trie;temp->next[0] = temp->next[1] = NULL;p->next[now] = temp;}p = p->next[now];}
}
int Query(Trie *q, int a)
{int i, now, bet;bet = 0;Trie *p = q;for(i=29;i>=0;i--){now = 0;if(a&(1<<i))now = 1;if(p->next[now^1]!=NULL){p = p->next[now^1];bet |= (1<<i);}elsep = p->next[now];}return bet;
}
Trie* Merge(Trie *p, Trie *q)
{if(p==NULL)return q;if(q==NULL)return p;p->next[0] = Merge(p->next[0], q->next[0]);p->next[1] = Merge(p->next[1], q->next[1]);free(q);return p;
}
void Delete(Trie *q)
{int i;if(q->next[0])Delete(q->next[0]);if(q->next[1])Delete(q->next[1]);free(q);
}
void Sech(int u)
{int i, v;root[u] = new Trie;root[u]->next[1] = root[u]->next[0] = NULL;Update(root[u], val[u]);for(i=0;i<G[u].size();i++){v = G[u][i];Sech(v);root[u] = Merge(root[u], root[v]);}for(i=0;i<Q[u].size();i++)ans[Q[u][i].id] = Query(root[u], Q[u][i].x);
}
int main(void)
{int n, q, i, x, y;while(scanf("%d%d", &n, &q)!=EOF){memset(ans, 0, sizeof(ans));for(i=1;i<=n;i++){G[i].clear();Q[i].clear();scanf("%d", &val[i]);}for(i=2;i<=n;i++){scanf("%d", &x);G[x].push_back(i);}for(i=1;i<=q;i++){scanf("%d%d", &y, &x);temp.x = x, temp.id = i;Q[y].push_back(temp);}Sech(1);for(i=1;i<=q;i++)printf("%d\n", ans[i]);Delete(root[1]);}
}
HDU 6191 2017广西邀请赛:Query on A Tree(字典树启发式合并)相关推荐
- HDU 6183 2017广西邀请赛:Color it(线段树)
题目太长了就直接放链接吧 http://acm.hdu.edu.cn/showproblem.php?pid=6183 题意: 一个空的坐标系,有④种操作:①1 x y c表示在(x, y)点染上颜色 ...
- HDU 6184 2017广西邀请赛:Counting Stars(三元环)
题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...
- HDU 6185 2017广西邀请赛:Covering(矩阵快速幂)
题意: 用1*2的骨牌铺满4*n的矩形总共有多种方法 经典题:可见骨牌铺方格的多种做法 因为宽只有4,考虑先求递推式,假设当前长度为x,有: ①长度为x-1的所有情况后面竖着放2个骨牌,f(x) += ...
- HDU 6188 2017广西邀请赛:Duizi and Shunzi
题意: 有n张牌,每张牌上都有一个不超过n的正整数,你可以选择三张数字连续的牌作为一个顺子,也可以选择两张数字一样的牌作为一个对子,现要让对子和顺子的数量之和尽可能多,求最大数量 先排序 因为对子只消 ...
- HDU 6186 2017广西邀请赛:CS Course
题意: n个数,m次查询,每次给出一个p,求出除了第p个数以外其它所有数的且和,或和,异或和 统计下每个二进制位1的数量,例如z[5] = x表示有x个数第5个二进制位为1 之后每次查询只要check ...
- HDU 6182 2017广西邀请赛:A Math Problem
题意: 给你一个n,问有多少个正整数k满足k^k<=n 暴力枚举,k不会超过15,唯一的坑点就是可能会爆long long #include<stdio.h> #define LL ...
- 2017广西邀请赛重现赛
总题解:http://www.nike0good.com/674.html 1001: 2017ACM/ICPC广西邀请赛-重现赛 1001 A Math Problem #include <i ...
- 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 ...
最新文章
- Rancher 推出 k3OS,业界首个 Kubernetes 操作系统
- Linux下多路复用IO接口epoll/select/poll的区别
- ont维修使能工具_上海OTC机器人维修保养以及调试服务了解
- 【AaronYang风格】第一篇 CodeFirst 初恋
- 【机器学习基础】机器学习小抄.pdf(像背托福单词一样理解机器学习)
- HALCON示例程序obj_diff.hdev算子obj_diff 的使用
- 【2018.4.14】模拟赛之二-ssl2392 蚂蚁【图论】
- Flutter InkWell 动画浅析
- JAVA wait(), notify(),sleep详解
- C/C++[PAT B1009]说反话
- 设计模式(八)桥接模式
- php爬虫框架下载文件,php爬虫框架怎么安装
- 15微型计算机系统不包括,全国2002年10月自学考试计算机应用基础真题
- Oracle无法标识锁定数据文件,启动错误ORA-01157: 无法标识/锁定数据文件 解决方案...
- python自动生成ppt_用Python自动化生成倒计时图片
- 新能源行业商业采购协同系统:赋能新能源行业采购业务,提升产业协同
- CefSharp内核浏览器之C#与js的互相调用
- 转载_BlueTooth: 蓝牙基带
- Springboot+vue项目体用用品销售商城网站
- WebRTC重要API和音视频分析
热门文章
- python和java的区别-java和python的区别
- python自动化办公演示视频-2020年最新Python自动化办公视频教程(2020/9/3)
- python从入门到精通需要多久-python学习从入门到精通要多久
- 自学python需要安装什么-Python学习需要安装的工具
- MongoDB数据库的介绍和连接(非常详细、易懂)
- 剑指 Offer II 006. 排序数组中两个数字之和
- LeetCode 700 二叉搜索树中的搜索
- 最简单的基于DirectShow的示例:视频播放器自定义版
- VirtualBox中的虚拟网络环境设置
- java中进制转换_java中的进制转换