题目大意:

有一棵树,根节点为1。每个点有点权。有两种操作。

1. 求节点x所在子树中点权与y异或的最大值。
2. 求x到y的路径上点权与z异或的最大值。

解题思路:

可持久化字典树。

对于第一种操作,我们对树进行dfs遍历,求出每个节点的dfs序(树剖),然后由于子树中dfs序连续,所以相当于区间的询问。对每个1~x区间建trie即可。

对于第二种操作,我们对每个节点建一颗trie,记录其到根的路径上的信息。

然后常规求LCA,减一减即可。

C++ Code:

#include<bits/stdc++.h>
const int N=1e5+5;
int ch[N<<6][2],siz[N<<6],ccnt=0,n,q,a[N],head[N],to[N<<1],nxt[N<<1];
int sz[N],dep[N],son[N],top[N],trie1[N],trie2[N],dfn[N],idfn[N],idx=0,fa[N],ans;
inline int readint(){int c=getchar(),d=0;for(;!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0');return d;
}
void Insert(int&nw,int&o,int&p,int pp=30){nw=++ccnt;if(!~pp)return(void)(siz[nw]=siz[o]+1);ch[nw][0]=ch[o][0];ch[nw][1]=ch[o][1];int nxt=(p>>pp)&1;Insert(ch[nw][nxt],ch[o][nxt],p,pp-1);siz[nw]=siz[ch[nw][0]]+siz[ch[nw][1]];
}
void dfs1(int now,int pre){sz[now]=1;Insert(trie1[now],trie1[pre],a[now]);for(int i=head[now];i;i=nxt[i])if(!dep[to[i]]){dep[to[i]]=dep[now]+1;fa[to[i]]=now;dfs1(to[i],now);sz[now]+=sz[to[i]];if(!son[now]||sz[to[i]]>sz[son[now]])son[now]=to[i];}
}
void dfs2(int now){idfn[dfn[now]=++idx]=now;if(son[now])top[son[now]]=top[now],dfs2(son[now]);for(int i=head[now];i;i=nxt[i])if(to[i]!=son[now]&&dep[to[i]]>dep[now])dfs2(top[to[i]]=to[i]);
}
inline int LCA(int x,int y){while(top[x]!=top[y])if(dep[top[x]]>=dep[top[y]])x=fa[top[x]];elsey=fa[top[y]];return dep[x]<dep[y]?x:y;
}
void query(int&R,int&L,int&num,int pp=30){if(!~pp)return;int nw=(num>>pp)&1^1;if(siz[ch[R][nw]]>siz[ch[L][nw]]){ans|=1<<pp;query(ch[R][nw],ch[L][nw],num,pp-1);}elsequery(ch[R][!nw],ch[L][!nw],num,pp-1);
}
void query2(int&x,int&y,int&lca,int&fa,int&num,int pp=30){if(!~pp)return;int nw=(num>>pp)&1^1;if(siz[ch[x][nw]]+siz[ch[y][nw]]-siz[ch[lca][nw]]-siz[ch[fa][nw]]>0){ans|=1<<pp;query2(ch[x][nw],ch[y][nw],ch[lca][nw],ch[fa][nw],num,pp-1);}elsequery2(ch[x][!nw],ch[y][!nw],ch[lca][!nw],ch[fa][!nw],num,pp-1);
}
int main(){n=readint(),q=readint();for(int i=1;i<=n;++i)a[i]=readint();for(int i=1;i<n;++i){int u=readint(),v=readint();to[i<<1]=v;nxt[i<<1]=head[u];head[u]=i<<1;to[i<<1|1]=u;nxt[i<<1|1]=head[v];head[v]=i<<1|1;}memset(dep,0,sizeof dep);memset(son,0,sizeof son);dep[1]=1;dfs1(1,0);dfs2(1);for(int i=1;i<=n;++i)Insert(trie2[i],trie2[i-1],a[idfn[i]]);while(q--)if(readint()==1){int x=readint(),y=readint();ans=0;query(trie2[dfn[x]+sz[x]-1],trie2[dfn[x]-1],y);printf("%d\n",ans);}else{int x=readint(),y=readint(),z=readint();int lca=LCA(x,y);ans=0;query2(trie1[x],trie1[y],trie1[lca],trie1[fa[lca]],z);printf("%d\n",ans);}return 0;
}

  

转载于:https://www.cnblogs.com/Mrsrz/p/9605160.html

[TJOI2018]xor相关推荐

  1. [TJOI2018]xor BZOJ5338 可持久trie

    遇到水题了.贼嗨森. 题目传送门 题意简单,就不多解释了. 可持久化trie树模板*2,就A了. 第一棵树表示从根到该点,第二棵树依靠dfs序建立.然后就是注意空间问题,我想省一下空间,结果31层的树 ...

  2. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  3. 【Codeforces/HDU】76A Plus and xor / 2095 find your present (2)(异或)。

    http://codeforces.com/contest/76/problem/D A = X + Y B = X xor Y 异或(不进位加法):两个二进制数,对应的位置上,相同为0,不同为1 性 ...

  4. 感知机搞不定逻辑XOR?Science新研究表示人脑单个神经元就能做到

    机器之心报道 参与:思源.张倩 长期以来,人们一直认为,要让神经网络解决「异或」问题就必须构造多层感知机,单个神经元是做不到的,这一认知使得神经网络的研究第一次进入寒冬.但最近的一项 Science ...

  5. 牛客练习赛32 -- Xor Path

    题解: 首先我们知道,一个点肯定不可能只出现一次的,他会出现好多次,但是根据二进制 a xor a =0 a xor a xor a =a 所以我们发现当某个点出现的次数为偶数次时,这个点相当于没有出 ...

  6. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  7. 线段树 ---- 牛客多校4 ETree Xor 区间异或分段

    题目链接 题目大意: 就是给你nnn个节点的树,树上每个节点都有一个权值wi∈[li,ri]w_i\in[l_i,r_i]wi​∈[li​,ri​],以及相邻(u,v)(u,v)(u,v)的异或值wu ...

  8. HDU3949 XOR (线性基、查找第k小值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 我们用高斯消元求出的a1,a2,-,ana_1,a_2, \dots,a_na1​,a2​,-,an​ ...

  9. P4588 [TJOI2018]数学计算(线段树维护区间乘和单点修改)

    P4588 [TJOI2018]数学计算 刚看到这题根本每想到用线段树,直接每次记录计算结果然后找到要除的数字就好了呗 但是!你会注意到,如果连续乘很多很多次,然后再除的话,如果不取模会爆 long ...

最新文章

  1. 8080端口被占用处理办法
  2. opencv光流Optical Flow
  3. 正则表达式过滤HTML危险脚本
  4. JavaScript使用localStorage缓存Js和css文件
  5. ibatis解决sql注入问题
  6. 权限操作-表结构分析与创建表
  7. 【每日一题】8月14日题目精讲 [SCOI2010]游戏
  8. 201521123061 《Java程序设计》第三周学习总结
  9. 怎样用html播放喜马拉雅音频文件格式,喜马拉雅音频提取方法
  10. 闪电网络开启BTC支付时代?他们不同意
  11. vue+高德地图 点击地图获取经纬度和详细地址
  12. 一键安装ROS和rosdep(NO 墙)
  13. Java金额大写转换
  14. CAT的Client端初始化
  15. 阿里P6+Java研发工程师,到底牛在哪儿?
  16. mysql 时间段天数_ORACLE任意时间段内所有天数日期查询
  17. PTA - 数据库合集22
  18. 良心推荐几款好玩的生存类手游:方舟生存进化、饥荒等等
  19. 看过大佬们发的朋友圈之后,我相信:明天会更好,明年定会春暖花开
  20. ffmpeg截取视频第一帧

热门文章

  1. python安装包_Python开发环境搭建
  2. 新装oracle如何启动服务,Oracle数据库新装之后出现的监听程序无法正常启动和运行(Oracle-12514)问题...
  3. java中我爱你_Java线程学习(转)
  4. mysql时间相减得到毫秒值_Mysql 字符串、时间、时间戳相互转换,相减获取秒数...
  5. java文件上传下载服务并发超时,先收藏了
  6. 深度学习生态圈【详解深度学习工具Keras】
  7. python二进制相加
  8. 登录MySQL非默认3306端口号的语句
  9. 2015中学计算机考试题,2017年初中信息技术考试试题及答案
  10. 单片机检测stc没反应_STC 核心板 入门记 - 你好我叫郑某人