bzoj

luogu

descirption

现在有一棵以 \(1\) 为根节点的由 \(n\) 个节点组成的树,树上每个节点上都有一个权值 \(v_i\) 。现在有 \(Q\) 次操作,操作如下:

\(1\;x\;y\) :查询节点 \(x\) 的子树中与 \(y\) 异或结果的最大值

\(2\;x\;y\;z\) :查询路径 \(x\) 到 \(y\) 上点与 \(z\) 异或结果最大值

sol

正在写线性基的同学们醒一醒

可持久化\(Trie\)树。

和可持久化线段树没什么区别。

自己\(yy\)了一种比较好写的方法,可以不记\(l\)和\(r\),只计当前的\(dep\)也就是二进制位。

为什么会有人写主席树强行\(\log^2n\)啊。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 1e5+5;
struct node{int ch[2],sz;}t[N*35];
int n,m,v[N],val[N],mx,l,to[N<<1],nxt[N<<1],head[N],cnt;
int fa[N],dep[N],sz[N],son[N],top[N],dfn[N],rt[N],tot;
void link(int u,int v){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void dfs1(int u,int f){
fa[u]=f;dep[u]=dep[f]+1;sz[u]=1;
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f){
dfs1(to[e],u),sz[u]+=sz[to[e]];
if (sz[to[e]]>sz[son[u]]) son[u]=to[e];
}
}
void dfs2(int u,int up){
top[u]=up;dfn[u]=++cnt;
if (son[u]) dfs2(son[u],up);
for (int e=head[u];e;e=nxt[e])
if (to[e]!=fa[u]&&to[e]!=son[u])
dfs2(to[e],to[e]);
}
void modify(int &x,int p,int dep){
t[++tot]=t[x];++t[x=tot].sz;
if (!~dep) return;
modify(t[x].ch[(p>>dep)&1],p,dep-1);
}
int query(int x,int y,int p,int dep){
if (!~dep) return 0;
int c=(p>>dep)&1;c^=1;
if (t[t[x].ch[c]].sz-t[t[y].ch[c]].sz) return query(t[x].ch[c],t[y].ch[c],p,dep-1)|(1<<dep);
c^=1;return query(t[x].ch[c],t[y].ch[c],p,dep-1);
}
int main(){
n=gi();m=gi();
for (int i=1;i<=n;++i) mx=max(mx,v[i]=gi());
while ((1<<l)<mx) ++l;--l;
for (int i=1;i<n;++i){
int u=gi(),v=gi();
link(u,v);link(v,u);
}
dfs1(1,0),cnt=0,dfs2(1,1);
for (int i=1;i<=n;++i) val[dfn[i]]=v[i];
for (int i=1;i<=n;++i) modify(rt[i]=rt[i-1],val[i],l);
while (m--){
int opt=gi();
if (opt==1){
int x=gi(),y=gi();
printf("%d\n",query(rt[dfn[x]+sz[x]-1],rt[dfn[x]-1],y,l));
}else{
int x=gi(),y=gi(),z=gi(),ans=0;
while (top[x]^top[y]){
if (dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,query(rt[dfn[x]],rt[dfn[top[x]]-1],z,l));
x=fa[top[x]];
}
if (dep[x]>dep[y]) swap(x,y);
ans=max(ans,query(rt[dfn[y]],rt[dfn[x]-1],z,l));
printf("%d\n",ans);
}
}
return 0;
}

[BZOJ5338][TJOI2018]xor的更多相关文章

  1. [BZOJ5338][TJOI2018]xor(可持久化Trie)

    可持久化Trie模板题. 建两种可持久化Trie,每个点两棵,一棵对DFS求前缀和,一棵对祖先求前缀和. 或者树剖,不好写多少还多个log. #include<cstdio> #inclu ...

  2. BZOJ5338[TJOI2018]xor——主席树+dfs序

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

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

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

  4. 可持久化trie(BZOJ5338: [TJOI2018]xor)

    题面 BZOJ Sol 显然是要维护一个区域的 \(trie\) 树,然后贪心 区间 \(trie\) 树??? 可持久化 \(trie\) 树??? 直接参考主席树表示出区间的方法建立 \(trie ...

  5. bzoj 5338: [TJOI2018]xor (树链剖分+可持久化01Trie)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5338 题面: 5338: [TJOI2018]xor Time Limit: 30 Sec  ...

  6. BZOJ.5338.[TJOI2018]xor(可持久化Trie)

    BZOJ LOJ 洛谷 惊了,18年了还有省选出模板题吗= = 做这题就是练模板的,我就知道我忘的差不多了 询问一就用以DFS序为前缀得到的可持久化Trie做,询问二很经典的树上差分. 注意求询问二的 ...

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

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

  8. [TJOI2018]xor

    题目大意: 有一棵树,根节点为1.每个点有点权.有两种操作. 1. 求节点x所在子树中点权与y异或的最大值.2. 求x到y的路径上点权与z异或的最大值. 解题思路: 可持久化字典树. 对于第一种操作, ...

  9. BZOJ 5338: [TJOI2018]xor 可持久化trie+dfs序

    强行把序列问题放树上,好无聊啊~ code: #include <bits/stdc++.h> #define N 200005 #define setIO(s) freopen(s&qu ...

随机推荐

  1. panda2

    pandas是python为数据分析建造的可靠工具,很多地方和R语言有想通之处.数据分析并不是工具越高深越好,excel,R,python都是针对不同情况的不同工具,各有各的优缺点,就像你要搭一个架子 ...

  2. 转:25个Java机器学习工具和库

    转自:http://www.cnblogs.com/data2value/p/5419864.html 本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习 ...

  3. yii2 的ActiveRecord

    一 .查询 返回数组 $cond[] = "and";//条件数组需要加and,单一个字符串不需要加. $cond[] = "payTime >= '{$start ...

  4. opencv:图像的基本变换

    0.概述 图像变换的基本原理都是找到原图和目标图的像素位置的映射关系,这个可以用坐标系来思考,在opencv中, 图像的坐标系是从左上角开始(0,0),向右是x增加方向(cols),向下时y增加方向( ...

  5. 016PHP基础知识——流程控制(四)

    <?php /** * 流程控制(四) do...while * do{ 代码段 * }while(){ * } * 特点:最少会执行一次代码段 */ /*$i=5; do{ echo $i; ...

  6. vue环境的搭建

    一.首先要安装nodejs : 别去官网下,慢的要死,这是国内的什么版本都有.地址 这是我下载的. 然后就傻瓜式安装. 验证是否安装成功 二.node.js的环境变量的新建.  //我安装的路径是D: ...

  7. LeetCode OJ:Climbing Stairs(攀爬台阶)

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  8. Linux输入输出管理

      一.系统输入输出的理解 运行一个程序时,需要从某个位置读取输入信息,然后CPU处理,最后将输出 显示在屏幕或文件中:其中,某个位置相当于输入设备,屏幕或文件为输出设备. 标准输入:stdin,默认 ...

  9. DW数据仓库与ODS的区别

    这两天接触到ODS,开始很纳闷,有了DW(Data Warehouse)干嘛还要ODS(Operational Data Store),于是不查不知道,一查吓一跳,这里面还有这么多道道,这里总结一下, ...

  10. TF随笔-10

    #!/usr/bin/env python# -*- coding: utf-8 -*-import tensorflow as tf x = tf.constant(2)y = tf.constan ...