题目链接

BZOJ4592

题解

可持久化trie树裸题

写完就A了

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. using namespace std;
  14. const int maxn = 100005,B = 30,maxm = 5000005,INF = 1000000000;
  15. inline int read(){
  16. int out = 0,flag = 1; char c = getchar();
  17. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  18. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  19. return out * flag;
  20. }
  21. int bin[50];
  22. struct Trie{
  23. int ch[maxm][2],sum[maxm],rt[maxn],cnt;
  24. int ins(int pre,int x){
  25. int tmp,u;
  26. tmp = u = ++cnt;
  27. for (int i = B; i >= 0; i--){
  28. ch[u][0] = ch[pre][0];
  29. ch[u][1] = ch[pre][1];
  30. sum[u] = sum[pre] + 1;
  31. int t = x & bin[i]; t >>= i;
  32. pre = ch[pre][t];
  33. u = ch[u][t] = ++cnt;
  34. }
  35. sum[u] = sum[pre] + 1;
  36. return tmp;
  37. }
  38. int query(int pre,int u,int x,int dep){
  39. if (dep < 0) return 0;
  40. int t = x & bin[dep]; t >>= dep;
  41. if (sum[ch[u][t ^ 1]] - sum[ch[pre][t ^ 1]])
  42. return bin[dep] + query(ch[pre][t ^ 1],ch[u][t ^ 1],x,dep - 1);
  43. return query(ch[pre][t],ch[u][t],x,dep - 1);
  44. }
  45. int Query(int a,int b,int c,int d,int x,int dep){
  46. if (dep < 0) return 0;
  47. int t = x & bin[dep]; t >>= dep;
  48. if (sum[ch[a][t ^ 1]] + sum[ch[b][t ^ 1]] - sum[ch[c][t ^ 1]] - sum[ch[d][t ^ 1]])
  49. return bin[dep] + Query(ch[a][t ^ 1],ch[b][t ^ 1],ch[c][t ^ 1],ch[d][t ^ 1],x,dep - 1);
  50. return Query(ch[a][t],ch[b][t],ch[c][t],ch[d][t],x,dep - 1);
  51. }
  52. }T1,T2;
  53. int n,Q,val[maxn];
  54. int h[maxn],ne = 1;
  55. struct EDGE{int to,nxt;}ed[maxn << 1];
  56. inline void build(int u,int v){
  57. ed[++ne] = (EDGE){v,h[u]}; h[u] = ne;
  58. ed[++ne] = (EDGE){u,h[v]}; h[v] = ne;
  59. }
  60. int dfn[maxn],fa[maxn][18],at[maxn],siz[maxn],dep[maxn],cnt;
  61. void dfs(int u){
  62. dfn[u] = ++cnt; at[cnt] = u; siz[u] = 1;
  63. T1.rt[u] = T1.ins(T1.rt[fa[u][0]],val[u]);
  64. REP(i,17) fa[u][i] =fa[fa[u][i - 1]][i - 1];
  65. Redge(u) if ((to = ed[k].to) != fa[u][0]){
  66. fa[to][0] = u; dep[to] = dep[u] + 1; dfs(to);
  67. siz[u] += siz[to];
  68. }
  69. }
  70. int lca(int u,int v){
  71. if (dep[u] < dep[v]) swap(u,v);
  72. for (int i = 0,d = dep[u] - dep[v]; (1 << i) <= d; i++)
  73. if (d & (1 << i)) u = fa[u][i];
  74. if (u == v) return u;
  75. for (int i = 17; i >= 0; i--)
  76. if (fa[u][i] != fa[v][i]){
  77. u = fa[u][i];
  78. v = fa[v][i];
  79. }
  80. return fa[u][0];
  81. }
  82. int main(){
  83. bin[0] = 1; REP(i,30) bin[i] = bin[i - 1] << 1;
  84. n = read(); Q = read();
  85. REP(i,n) val[i] = read();
  86. for (int i = 1; i < n; i++) build(read(),read());
  87. dfs(1);
  88. for (int i = 1; i <= n; i++)
  89. T2.rt[i] = T2.ins(T2.rt[i - 1],val[at[i]]);
  90. int opt,x,y,z,o;
  91. while (Q--){
  92. opt = read(); x = read(); y = read();
  93. if (opt & 1){
  94. printf("%d\n",T2.query(T2.rt[dfn[x] - 1],T2.rt[dfn[x] + siz[x] - 1],y,B));
  95. }
  96. else {
  97. z = read(); o = lca(x,y);
  98. printf("%d\n",T1.Query(T1.rt[x],T1.rt[y],T1.rt[o],T1.rt[fa[o][0]],z,B));
  99. }
  100. }
  101. return 0;
  102. }

洛谷P4592 [TJOI2018]异或 【可持久化trie树】的更多相关文章

  1. 洛谷P4592 [TJOI2018]异或(可持久化01Trie)

    题意 题目链接 可持久化01Trie板子题 对于两个操作分别开就行了 #include<bits/stdc++.h> using namespace std; const int MAXN ...

  2. 洛谷 P4592 [TJOI2018]异或 解题报告

    P4592 [TJOI2018]异或 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1 x y:查 ...

  3. [洛谷P4592][TJOI2018]异或

    题目大意:有一棵$n$个点的树,第$i$个点权值为$w_i$,有两种操作: $1\;x\;y:$询问节点$x$的子树中与$y$异或结果的最大值 $2\;x\;y\;z:$询问路径$x$到$y$上点与$ ...

  4. [TJOI2018] Xor 异或 (可持久化Trie,树链剖分)

    题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. ...

  5. BZOJ5338 [TJOI2018] Xor 【可持久化Trie树】【dfs序】

    题目分析: 很无聊的一道题目.首先区间内单点对应异或值的询问容易想到trie树.由于题目在树上进行,case1将路径分成两段,然后dfs的时候顺便可持久化trie树做询问.case2维护dfs序,对d ...

  6. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. 洛谷P3834【模板】可持久化线段树 1(主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  8. 洛谷P2922 [USACO008DEC] 秘密消息Secret Message [Trie树]

    洛谷传送门,BZOJ传送门 秘密消息Secret Message Description     贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.     信息是二进制的,共有M(1≤M≤5 ...

  9. POJ 2104 K-th Number && 洛谷 P3834 【模板】可持久化线段树 1(主席树)

    我惊奇的发现这两道题一模一样 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询 ...

随机推荐

  1. STM32Cube 5.0 使用V1.7.0的固件库生成keil5环境下的F1工程时发现问题

    生成的stm32f1xx_hal_msp.c文件里面,HAL_MspInit(void)函数居然没有了之前1.6库里面的系统中断优先级的设置: /* MemoryManagement_IRQn int ...

  2. "Mon Dec 31 00:00:00 CST 2012" java日期装换 "yyyy-MM-dd"

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import ja ...

  3. Python3爬虫(三)请求库的使用之urllib

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.urllib库: 1. 是Python内置的HTTP请求库 2. 在Python2中,由urllib和urll ...

  4. VGA 时序标准

    VGA 显示器扫描方式从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步:当扫描完所有的行 ...

  5. Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇)

    原文:Windows 10 下如何彻底关闭 Hyper-V 服务(翻外篇) windows禁用/启用hyper-V,解决hyper-V与模拟器同时启用时造成冲突 我是这样解决的,以管理员身份运行命令提 ...

  6. Mysql自学笔记

    SQL(strucut query language) DDL (数据库定义语言)DML (数据库操作语言)DCL (数据库的控制语言)DTL (数据库的高级语言)查看版本的函数select vers ...

  7. C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C# ...

  8. 初探Qt Opengl【1】

    最近一直在学习Qt的opengl绘图,看到好多资源都是关于以前的旧版本的, 我将我这几天学的的部分关于opengl的做个总结,也希望对需要学习的人有一定的帮助 在我的学习中,我主要用到一下三个方法 # ...

  9. 解析·NOIP·冷门 CLZ最小环

    赐予我力量,去改变我所能改变的;赐予我勇气,去接受我不能改变的;并赐予我智慧,去分辨这两者. -----安东尼达斯 NOIP的图论题中有一部分是跟图上的环有关的.蒟蒻的我在USACO上刷题时发现了一种 ...

  10. Python网络编程(线程通信、GIL、服务器模型)

    什么是进程.进程的概念? 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间, 一般情况下,包括文本区域(text region).数据区域(data region)和堆栈( ...