P4592 [TJOI2018]异或 树链剖分 01trie
时间:2019-09-13
本文章向大家介绍P4592 [TJOI2018]异或 树链剖分 01trie,主要包括P4592 [TJOI2018]异或 树链剖分 01trie使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
树剖上维护可持久化01trie即可
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// const int N=2e6+10; int T[N],Siz[N<<5],t[N<<5][2],ncnt; void upnode(int k,int val,int pre,int &pos) { pos=++ncnt; Siz[pos]=Siz[pre]+1; t[pos][0]=t[pre][0]; t[pos][1]=t[pre][1]; if(k<0)return ; int c=(val>>k)&1; upnode(k-1,val,t[pre][c],t[pos][c]); } int qmax(int k,int val,int pre,int pos) { if(k<0)return 0; int c=(val>>k)&1; int si=Siz[t[pos][c^1]]-Siz[t[pre][c^1]]; if(si)return (1<<k)+qmax(k-1,val,t[pre][c^1],t[pos][c^1]); else return qmax(k-1,val,t[pre][c],t[pos][c]); } int head[N],top[N],pos,id[N],tot,fa[N],dep[N],son[N],siz[N],n,m,node[N]; struct Edge{int to,nex;}edge[N<<1]; void add(int a,int b){edge[++pos]=(Edge){b,head[a]};head[a]=pos;} void dfs1(int x,int f) { fa[x]=f;dep[x]=dep[f]+1;siz[x]=1;son[x]=0; for(int i=head[x];i;i=edge[i].nex) { int v=edge[i].to; if(v==f)continue; dfs1(v,x);siz[x]+=siz[v]; if(siz[son[x]]<siz[v])son[x]=v; } } void dfs2(int x,int topf) { top[x]=topf;id[x]=++tot; upnode(30,node[x],T[tot-1],T[tot]); if(son[x])dfs2(son[x],topf); for(int i=head[x];i;i=edge[i].nex) { int v=edge[i].to;if(v==fa[x]||v==son[x])continue; dfs2(v,v); } } int Qmax(int x,int y,int val) { int ans=0; while(top[x]!=top[y]) { if(dep[top[x]]<dep[top[y]])swap(x,y); ans=max(ans,qmax(30,val,T[id[top[x]]-1],T[id[x]])); x=fa[top[x]]; } if(dep[x]>dep[y])swap(x,y); ans=max(ans,qmax(30,val,T[id[x]-1],T[id[y]])); return ans; } int main() { scanf("%d%d",&n,&m); rep(i,1,n) scanf("%d",&node[i]); rep(i,1,n-1) { int a,b;scanf("%d%d",&a,&b); add(a,b);add(b,a); } dfs1(1,0); dfs2(1,1);int x,y,z,op; while(m--) { scanf("%d",&op); if(op==1)scanf("%d%d",&x,&y),printf("%d\n",qmax(30,y,T[ id[x]-1 ],T[ id[x]+siz[x]-1 ] )); else scanf("%d%d%d",&x,&y,&z), printf("%d\n",Qmax(x,y,z)); } return 0; }
原文地址:https://www.cnblogs.com/bxd123/p/11516702.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RTSP/GB28181/HIKSDK/Ehome协议视频融合平台EasyCVR编译C++报参见“XXX”的声明错误
- 详解 Linux 常用目录的作用
- CentOS6环境下搭建路由器的方法
- centos7下NFS使用与配置的步骤
- 基于DOM4J的XML文件解析类
- Win7安装和配置Apache2.4服务器的详细方法
- shiro会话管理示例代码
- Windows Apache2.4 VC9(ApacheHaus)详细安装配置教程
- 在centos 7中安装配置k8s集群的步骤详解
- Centos7.2 编译安装方式搭建 phpMyAdmin
- CentOS 6.5 web服务器apache的安装与基本设置
- Linux本机与服务器文件互传及Linux服务器文件上传下载命令写法
- linux利用read命令获取变量中的值
- 解决Centos7 安装腾达U12无线网卡驱动问题
- CentOS 6.5上编译安装Apache服务器的方法(最小化安装)