题意:给出一棵n(<=1e5)个点的树,每个点有一个权,询问q(<=qe5)次,每次询问(nod,val),计算出以nod为根的子树上的所有点,权抑或val的最大值是多少。

题解:基本上是个板子题吧。直接讲方法了。。直接上DFS序+可持久化01字典树就行了。可持久化01字典树可以用32步查得一个区间内某个数字和val抑或得到的最大答案,那么DFS序一下就可以把子树搞成区间。然后完美解决。

可持久化01字典树:可以理解成在字典树的每个节点上弄了个前缀和一样的东西吧,重点在空间复用。每个字典树节点增加sum域,记录前边数字中有多少个数字走到这个节点。每次加入一个新的数字,都开一个“全新”的字典树,把每个树的根都记下来。这个新的字典树包括了之前加入的所有数字,也包括当前数字,但是这样超级浪费空间,怎么办呢,我们知道 加入一个新的数字,和上一棵树最多只会有32个点不同。那么新树和上一个树不变的点就直接用上一棵树的就行了(两个树相同的部分重合起来,不需要新开点来存了),把新的点的sum给更新了就行了。

查询:查询区间[ l , r ]时,同时查root[ l-1 ] 和 root[ r ]这两棵树,同时往下走,如果sum不同, 说明[ l , r ]区间内的某个数字出现在这条链路上,那么就可以往这个方向走。然后取抑或最大操作和普通01字典树无异,都是贪心的高位能取不同就不同,否则取相同(相同和不同必然可以取一个,要不然岂不是说明这个区间内没有数字了。。。)。

Flag:01字典树什么的不可能写WA的hhhhhh(除非是能把x写成y的lowB葫芦娃)

以及博主最近沉迷冒险岛2。。。。。。没救了

Code:

#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e5+100;
int bas[35];
int nxt[MAX<<5][2];
int root[MAX];
int sum[MAX<<5];
int n,q;
vector<int>E[MAX];
int st[MAX],en[MAX],rk[MAX];
int a[MAX];
int cnt;
int tot;
void sheet(){bas[0]=1;for (int i=1;i<=30;i++){bas[i] = bas[i-1]<<1;}
}
void init(){for (int i=0;i<=n;i++){E[i].clear();}cnt =tot=0;memset(nxt[0],0,sizeof nxt[0]);
}
void input(){for (int i=1;i<=n;i++){scanf("%d",a+i);}for (int u=2;u<=n;u++){int v;scanf("%d",&v);E[u].push_back(v);E[v].push_back(u);}
}
void dfs(int node ,int  father ){st[node] = ++tot;rk[tot] = node;for (int des:E[node]){if(des==father){continue;}dfs(des,node);}en[node] = tot;
}
int create(){cnt++;memset(nxt[cnt],0,sizeof nxt[cnt]);return cnt;
}
int insert(int rt,int val){int y = ++cnt;int x = rt;int res = y;for (int i=30;i>=0;i--){sum[y] = sum[x]+1;nxt[y][0] = nxt[x][0];nxt[y][1] = nxt[x][1];int t = val&bas[i];t>>=i;nxt[y][t] = create();y = nxt[y][t];x = nxt[x][t];}sum[y] = sum[x]+1;return res;
}
int query(int l,int r,int val){int res =0;int x = l;int y = r;for (int i=30;i>=0;i--){int t = val&bas[i];t>>=i;if (sum[nxt[y][!t]]-sum[nxt[x][!t]]){y = nxt[y][!t];x = nxt[x][!t];res+=bas[i];}else{y = nxt[y][t];x = nxt[x][t];} }return res;
}
void solve(){dfs(1,0);for (int i=1;i<=n;i++){root[i] = insert(root[i-1],a[rk[i]]);}while (q--){int nod,x;scanf("%d%d",&nod,&x);printf("%d\n",query(root[st[nod]-1],root[en[nod]],x));}
}
int main(){sheet();while (scanf("%d%d",&n,&q)!=EOF){init();input();solve();} return 0;
}

HDU 6191 2017广西邀请赛Query on A Tree:可持久化01字典树(区间抑或最大值查询)相关推荐

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

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

  2. HDU 6183 2017广西邀请赛:Color it(线段树)

    题目太长了就直接放链接吧 http://acm.hdu.edu.cn/showproblem.php?pid=6183 题意: 一个空的坐标系,有④种操作:①1 x y c表示在(x, y)点染上颜色 ...

  3. HDU 6184 2017广西邀请赛:Counting Stars(三元环)

    题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...

  4. HDU 6185 2017广西邀请赛:Covering(矩阵快速幂)

    题意: 用1*2的骨牌铺满4*n的矩形总共有多种方法 经典题:可见骨牌铺方格的多种做法 因为宽只有4,考虑先求递推式,假设当前长度为x,有: ①长度为x-1的所有情况后面竖着放2个骨牌,f(x) += ...

  5. HDU 6188 2017广西邀请赛:Duizi and Shunzi

    题意: 有n张牌,每张牌上都有一个不超过n的正整数,你可以选择三张数字连续的牌作为一个顺子,也可以选择两张数字一样的牌作为一个对子,现要让对子和顺子的数量之和尽可能多,求最大数量 先排序 因为对子只消 ...

  6. HDU 6186 2017广西邀请赛:CS Course

    题意: n个数,m次查询,每次给出一个p,求出除了第p个数以外其它所有数的且和,或和,异或和 统计下每个二进制位1的数量,例如z[5] = x表示有x个数第5个二进制位为1 之后每次查询只要check ...

  7. HDU 6182 2017广西邀请赛:A Math Problem

    题意: 给你一个n,问有多少个正整数k满足k^k<=n 暴力枚举,k不会超过15,唯一的坑点就是可能会爆long long #include<stdio.h> #define LL ...

  8. 2017广西邀请赛重现赛

    总题解:http://www.nike0good.com/674.html 1001: 2017ACM/ICPC广西邀请赛-重现赛 1001 A Math Problem #include <i ...

  9. HDU 4825:Print Article(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  10. HDU 5536 Chip Factory (01字典树)

    传送门:HDU 5536 题目大意: 在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i.j.k 各不相同. 前至技能:01字典树详解. 思路: 01字典树模板可以解决查找与 x ...

最新文章

  1. Linux系统灾难恢复技术和方法-[3]
  2. UVAlive 7041 The Problem to Slow Down You(回文树)
  3. delphi读取excel
  4. 收集实用的MySQL使用技巧
  5. Linux配置手册(二)配置DHCP服务器
  6. Luogu 3625 [APIO2009]采油区域
  7. 想批量转换音频?来试试这几个会议录音转文字软件
  8. java html转pdf 无法支持中文_java转pdf(html转为pdf),解决中文乱码,标签不规范等问题...
  9. 日本最惨数学天才!37岁裸辞,房子被政府没收,向全村人乞讨,一家五口只能吃野菜.........
  10. 封校大学生在宿舍无聊玩起图像大找茬——一个关于游戏的练手小项目(一起领略Python脚本的风采吧)
  11. Centos7(linux)下hbase的伪分布式搭建以及eclipse远程连接
  12. CSAPP: Architecture Lab
  13. 笔记本计算机拆开视频,Designer笔记本电脑的视频电路拆解
  14. 对“英语趣配音”学习软件的教学设计分析
  15. We should: Good Good Study, Day Day Up
  16. 探索前端CSS样式表的真谛
  17. 如何屏蔽电脑弹出的广告
  18. 微积分 / 自动求导
  19. el-table怎么设置单个表格变颜色
  20. 软件著作权如何申请?

热门文章

  1. php网页错误404,php出现404错误页面的解决方法
  2. 中兴ZXV10 B860AV1.1 全TTL操作完美破解
  3. BC26opencpu
  4. BC26接入电信平台
  5. java h5 调用摄像头_基于百度AI使用H5实现调用摄像头进行人脸注册、人脸搜索功能(Java)...
  6. 机器视觉——光源选型
  7. 人工智能-SVM 支持向量机
  8. 17年前那场疫情:马云隔离在家,刘强东关了12家店,俞敏洪欠债700万......
  9. 本特利3300XL 25mm前置器 330780-50-CN
  10. MULTISIM安装下载