HDU6191Query on A Tree(字典树启发式合并)
来源:互联网 发布:软文软件 编辑:程序博客网 时间:2024/05/29 18:03
题意:
有一棵n个节点的有根树,每个节点都有一个值,m次查询,每次两个数x y表示以x为根的子树中哪个节点权值异或
y得出的结果最大,求最大结果
思路:
离线
和线段树合并一样,在搜索过程中将多个字典树并在一起
每次查询遍历以当前子树的根为根的字典树
#include<bits/stdc++.h>using namespace std;#define N 100005template <class T> inline void in(T &x){ T f = 1; char c; while ((c = getchar()) < '0' || c > '9') if (c == '-') f = -1; x = c - '0'; while ((c = getchar()) >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0'; x *= f;}struct ask{ int u, id;};struct Trie{ Trie *nxt[2]; Trie() { nxt[0]=nxt[1]=NULL; }};int ans[N], val[N], n, q;vector<int> G[N];vector<ask> Q[N];Trie *root[N];void Insert(Trie *rt, int x){ int id; for(int i=30; i>=0; i--) { id=0; if(x&(1<<i)) id=1; if(rt->nxt[id]==NULL) { Trie *temp=new Trie(); rt->nxt[id]=temp; } rt=rt->nxt[id]; }}int query(Trie *rt, int x){ int ret=0, id; for(int i=30; i>=0; i--) { id=0; if(x&(1<<i)) id=1; if(rt->nxt[id^1]!=NULL) { rt=rt->nxt[id^1]; ret|=(1<<i); } else rt=rt->nxt[id]; } return ret;}Trie* Merge(Trie *p, Trie *q){ if(p==NULL) return q; if(q==NULL) return p; p->nxt[0]=Merge(p->nxt[0], q->nxt[0]); p->nxt[1]=Merge(p->nxt[1], q->nxt[1]); free(q); return p;}void build(int u){ int v; root[u]=new Trie(); Insert(root[u], val[u]); for(int i=0; i<G[u].size(); i++) { v=G[u][i]; build(v); root[u]=Merge(root[u], root[v]); } for(int i=0; i<Q[u].size(); i++) ans[Q[u][i].id]=query(root[u], Q[u][i].u);}void Delete(Trie *rt){ if(rt->nxt[0]) Delete(rt->nxt[0]); if(rt->nxt[1]) Delete(rt->nxt[1]); free(rt);}void solve(){ int u, x; ask temp; for(int i=1; i<=n; i++) { G[i].clear(); Q[i].clear(); in(val[i]); } for(int i=2; i<=n; i++) { in(x); G[x].push_back(i); } for(int i=1; i<=q; i++) { in(u); in(x); temp.u=x; temp.id=i; Q[u].push_back(temp); } build(1); for(int i=1; i<=q; i++) printf("%d\n", ans[i]); Delete(root[1]);}int main(){ while(scanf("%d%d", &n, &q)!=EOF) { solve(); } return 0;}
阅读全文
0 0
- HDU6191Query on A Tree(字典树启发式合并)
- [hdu 6191 Query on A Tree] 字典树启发式合并
- HDU 6191 && 2017广西邀请赛:Query on A Tree(字典树启发式合并)
- 2017 广西邀请赛&& hdu 6191 Query on A Tree(字典树启发式合并)
- hdu 6191 Query on A Tree(字典树启发式合并(动态建树) 可持久化字典树+dfs序)
- hdu 4670 Cube number on a tree,平衡树,启发式合并
- 启发式合并/dsu on tree 姿势
- HDU 6191 Query on A Tree 可持久化trie + dfs建树 || 启发式合并trie
- HDU-6191 01字典树+启发式合并
- CSU 1811 Tree Intersection(线段树+启发式合并 解法)
- 学习总结:Dsu on tree 树上启发式合并
- [BZOJ2599][IOI2011]Race-树上启发式合并(dsu on tree)
- dsu on tree(树上启发式合并)简介(codeforces 600 E)
- hdu4812 D Tree,平衡树,启发式合并
- poj1741 Tree,平衡树,启发式合并
- 【平衡树启发式合并】POJ1741[Tree]题解
- CSU 1811 Tree Intersection(启发式合并)
- 2017广西邀请赛 Query on A Tree(可持久化字典树)
- Junit单元测试学习笔记一
- 《C Primer Plus》笔记
- 微信硬件平台
- nyoj21 三个水杯(bfs)
- Loadrunner之打印接口返回值&处理返回值中的中文
- HDU6191Query on A Tree(字典树启发式合并)
- 手记1
- 还是回文
- 字符串练习11_潜伏者
- 基于nginx-rtmp实现电视回看业务
- net
- textArea实时显示文本输入框输入的字数
- my97
- js中获取时间new Date()详细介绍