写板子了,可持久化\(Trie\)的板子了

其实和主席树写法类似,还是存好左右儿子之后存好权值

之后差分去查询就好了

这道题第一问我们直接\(dfs\)序转化成区间

第二问搞成\(x,y,lca(x,y),fa[lca]\)之后一起差分就好了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 100005
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct E{int v,nxt;}e[maxn<<1];
int n,m,__,num,bit[35],cnt;
int rt[maxn],ch[maxn*35*2][2],v[maxn*35*2],a[maxn],Rt[maxn];
int head[maxn],top[maxn],son[maxn],sum[maxn],fa[maxn],to[maxn],_to[maxn],deep[maxn];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
int change(int pre,int t) {int root=++cnt;int val=bit[t];v[root]=v[pre]+1;if(!t) return root;ch[root][val^1]=ch[pre][val^1];ch[root][val]=change(ch[pre][val],t-1);return root;
}
int query(int l,int r,int t) {if(!t) return 0;int val=bit[t];int now=v[ch[r][val^1]]-v[ch[l][val^1]];if(now) return (1<<(t-1))+query(ch[l][val^1],ch[r][val^1],t-1);return query(ch[l][val],ch[r][val],t-1);
}
int ask(int a,int b,int c,int d,int t) {if(!t) return 0;int val=bit[t];int now=v[ch[a][val^1]]+v[ch[b][val^1]]-v[ch[c][val^1]]-v[ch[d][val^1]];if(now) return (1<<(t-1))+ask(ch[a][val^1],ch[b][val^1],ch[c][val^1],ch[d][val^1],t-1);return ask(ch[a][val],ch[b][val],ch[c][val],ch[d][val],t-1);
}
void dfs1(int x) {int maxx=-1;sum[x]=1;for(re int i=head[x];i;i=e[i].nxt)if(!deep[e[i].v]){deep[e[i].v]=deep[x]+1;int now=0,t=a[e[i].v];memset(bit,0,sizeof(bit));while(t) bit[++now]=(t&1),t>>=1;Rt[e[i].v]=change(Rt[x],32);fa[e[i].v]=x;dfs1(e[i].v);sum[x]+=sum[e[i].v];if(sum[e[i].v]>maxx) maxx=sum[e[i].v],son[x]=e[i].v;}
}
void dfs2(int x,int topf) {top[x]=topf;to[++__]=x;_to[x]=__;if(!son[x]) return;dfs2(son[x],topf);for(re int i=head[x];i;i=e[i].nxt) if(!top[e[i].v]) dfs2(e[i].v,e[i].v);
}
inline int LCA(int x,int y) {while(top[x]!=top[y]){if(deep[top[x]]<deep[top[y]]) std::swap(x,y); x=fa[top[x]];}if(deep[x]<deep[y]) return x;return y;
}
int main()
{n=read(),m=read();for(re int i=1;i<=n;i++) a[i]=read();int x,y,opt,val;for(re int i=1;i<n;i++) x=read(),y=read(),add(x,y),add(y,x);deep[1]=1,dfs1(1),dfs2(1,1);for(re int i=1;i<=n;i++) {int now=0,t=a[to[i]];memset(bit,0,sizeof(bit));while(t) bit[++now]=(t&1),t>>=1;rt[i]=change(rt[i-1],32);}while(m--){opt=read();x=read();if(opt==1) val=read();if(opt==2) y=read(),val=read();int now=0;memset(bit,0,sizeof(bit));while(val) bit[++now]=(val&1),val>>=1;if(opt==1) printf("%d\n",query(rt[_to[x]-1],rt[_to[x]+sum[x]-1],32));if(opt==2) {int lca=LCA(x,y);printf("%d\n",ask(Rt[x],Rt[y],Rt[lca],Rt[fa[lca]],32));}}return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10252615.html

【[TJOI2018]异或】相关推荐

  1. P4592 [TJOI2018]异或

    P4592 [TJOI2018]异或 题意: 现在有一颗以 1 为根节点的由 n 个节点组成的树,节点从 1 至 n 编号.树上每个节点上都有一个权值 vi.现在有 q 次操作,操作如下: 1 x z ...

  2. P4592 [TJOI2018]异或 (可持久化Trie)

    [题目链接] https://www.luogu.org/problemnew/show/P4592 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\ ...

  3. 可持久化3--可持久化01Trie

    01Trie 可持久化 01Trie 的方式和可持久化值域线段树的方式是相似的,只是以 01字典树 的方式来维护值域.一般用来解决异或相关的能够按位贪心的题目. 其实就是将可持久化线段树中的操作嫁接到 ...

  4. java ftp输出流_java输出流实现文件下载

    //导出Excel try { HSSFWorkbook wb = carService.export(list); //调用service方法~! response.setContentType(& ...

  5. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  6. 不占用多余空间实现值的交换——异或运算

    首先什么是异或运算? ^规则: 0 ^ x = x x ^ x = 0 那么 a 与 b 交换值如何做呢???三行代码

  7. 左神讲算法——异或的高级操作(两数交换+经典面试题)

    目录 1. 异或的性质 2. 两数交换 3. 经典面试例题 参考链接:2021最新左神数据结构算法全家桶 1. 异或的性质 异或可以看成相同为1,不同为0:也可以看作无进位相加,有奇数个1则结果为1, ...

  8. 《The Sixth Sense》(《灵异第六感》)观后

    记得在学校的时候看过一部片子<左眼看到鬼>,现在想想那部片子有抄袭<Tht Sixth Sense>的嫌疑.不过抄袭也差得远. 现在真的懒得看港台片了,国内的农村,山村题材的都 ...

  9. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

最新文章

  1. python列表解析式_Python基础入门-列表解析式
  2. MATLAB从入门到精通-MATLAB结构矩阵的输出
  3. 手机java软件_浅谈软件开发就业前景
  4. 数据结构之二叉树的遍历
  5. mysql 主键唯一,MySQL。关键表中的主键。唯一ID还是多个唯一键?
  6. 区块链技术学习之-简单加密货币-高飞币
  7. ios10发邮件服务器拒绝,IOS10用户拒绝网络权限后,如何引导开启?
  8. java连接oftp_[Share] EDI 系统之 OFTP 端口
  9. 《Android安全技术揭秘与防范》——第2章,第2.1节钱从哪里来
  10. 转:硬盘结构简介的好文(转)---MBR、分区表、CHS等概念
  11. Ubuntu20.04 美化
  12. Win7安装VMware Tools问题
  13. 外贸公司申请一个企业邮箱,国外邮箱大全对比
  14. cocos creator性能优化合集
  15. 关于可计算、图灵机及CPU性能
  16. LeeTCode:6. Z 字形变换 python实现
  17. C语言编写SSH终端
  18. 金融风控数据挖掘--Task1
  19. 来日时必备物品清单:
  20. 给apple老师建议

热门文章

  1. Flink + Iceberg 在去哪儿的实时数仓实践
  2. 边缘计算在天猫精灵云应用上的落地实践
  3. 如何让 Flutter 应用更好地使用 SVG?
  4. 游戏UI设计师怎样的作品更值钱?
  5. 新手教程:用像素游戏制作大师MV开发游戏(一)
  6. 使用pv命令限制SQL文本导入速度
  7. 上一局APP玩边画边猜,第1次见人使用道具,我的游戏体验上升了
  8. ORA-20000: ORU-10027: 执行存储过程的错误
  9. 远程桌面连接数超过最大限制解决方法
  10. DDL与DML的区别