题目传送门:洛谷P4592

题意简述:

题面说的很清楚了。

题解:

发现没有修改很快乐。再看异或最大值操作,很容易想到可持久化 01trie。

这里要把 01trie 搬到树上,有点难受。

树剖太捞了,考虑 DFS 序。

子树查询转成 DFS 序上一段区间,而链上查询转成两条链。

所以维护两(个?)种可持久化 01trie,一个按照 DFS 序,另一个按照从根到结点的路径。

还要求 LCA,这里我写了个倍增。

#include <cstdio>

inline int Max(int x, int y) { return x > y ? x : y; }

const int MN = 100005;
const int MS = 6200005;
const int BK = 29; int N, Q;
int A[MN];
int eh[MN], nxt[MN * 2], to[MN * 2], tot;
inline void insw(int x, int y) {
nxt[++tot] = eh[x]; to[tot] = y; eh[x] = tot;
nxt[++tot] = eh[y]; to[tot] = x; eh[y] = tot;
} int sz[MS], ch[MS][2], cnt;
int rt1[MN], rt2[MN];
inline void Ins(int &rt, int x, int j) {
ch[++cnt][0] = ch[rt][0], ch[cnt][1] = ch[rt][1], sz[cnt] = sz[rt], rt = cnt;
++sz[rt];
if (~j) Ins(ch[rt][x >> j & 1], x, j - 1);
} int ldf[MN], rdf[MN], dep[MN], faz[MN][17], dfc; void DFS(int u, int fa) {
ldf[u] = ++dfc; faz[u][0] = fa; dep[u] = dep[fa] + 1;
Ins(rt1[dfc] = rt1[dfc - 1], A[u], BK);
Ins(rt2[u] = rt2[fa], A[u], BK);
for (int j = 1; 1 << j < dep[u]; ++j) faz[u][j] = faz[faz[u][j - 1]][j - 1];
for (int i = eh[u]; i; i = nxt[i]) if (to[i] != fa) DFS(to[i], u);
rdf[u] = dfc;
} inline int LCA(int x, int y) {
if (dep[x] < dep[y]) x ^= y ^= x ^= y;
for (int d = dep[x] - dep[y], j = 0; d; d >>= 1, ++j) if (d & 1) x = faz[x][j];
if (x == y) return x;
for (int j = 16; ~j; --j) if (faz[x][j] != faz[y][j]) x = faz[x][j], y = faz[y][j];
return faz[x][0];
} int Qu(int rt1, int rt2, int x, int j) {
if (j == -1) return 0;
int p = (x >> j & 1) ^ 1;
if (sz[ch[rt1][p]] - sz[ch[rt2][p]])
return Qu(ch[rt1][p], ch[rt2][p], x, j - 1) | 1 << j;
return Qu(ch[rt1][p ^ 1], ch[rt2][p ^ 1], x, j - 1);
} int main() {
scanf("%d%d", &N, &Q);
for (int i = 1; i <= N; ++i)
scanf("%d", A + i);
for (int i = 1, x, y; i < N; ++i) {
scanf("%d%d", &x, &y);
insw(x, y);
}
DFS(1, 0);
for (int i = 1, opt, x, y, z; i <= Q; ++i) {
scanf("%d", &opt);
if (opt == 1) {
scanf("%d%d", &x, &z);
printf("%d\n", Qu(rt1[rdf[x]], rt1[ldf[x] - 1], z, BK));
}
else {
scanf("%d%d%d", &x, &y, &z);
int w = faz[LCA(x, y)][0];
printf("%d\n", Max(Qu(rt2[x], rt2[w], z, BK), Qu(rt2[y], rt2[w], z, BK)));
}
}
return 0;
}

洛谷 P4592: bzoj 5338: [TJOI2018]异或的更多相关文章

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

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

  2. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

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

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

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

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

  5. 洛谷 P3307: bzoj 3202: [SDOI2013] 项链

    题目传送门:洛谷P3307.这题在bzoj上是权限题. 题意简述: 这题分为两个部分: ① 有一些珠子,每个珠子可以看成一个无序三元组.三元组要满足三个数都在$1$到$m$之间,并且三个数互质,两个珠 ...

  6. 洛谷 4106 / bzoj 3614 [HEOI2014]逻辑翻译——思路+类似FWT

    题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 ...

  7. 洛谷 P3332 BZOJ 3110 [ZJOI2013]K大数查询

    题目链接 洛谷 bzoj 题解 整体二分 Code #include<bits/stdc++.h> #define LL long long #define RG register usi ...

  8. 洛谷 P2486 BZOJ 2243 [SDOI2011]染色

    题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221” ...

  9. 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

随机推荐

  1. python mysql开发日志

    开始做python 的数据库访问了,暂时选定了mysql数据库.原本想使用ORM,后来考虑到项目的情况是:表结构不复杂,但是数据库非常大.还是自己来操作sql,不过PYTHON的那些数据库ORM的代码 ...

  2. windows和Ubantu双系统安装图解

    Win7 U盘安装Ubuntu16.04 双系统详细教程 安装主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: ...

  3. es各类SearchType的意思

    元素 含义 QUERY_THEN_FETCH 查询是针对所有的块执行的,但返回的是足够的信息,而不是文档内容(Document).结果会被排序和分级,基于此,只有相关的块的文档对象会被返回.由于被取到 ...

  4. winform 利用委托实现窗体传值

    父窗体:Form1    ,有个 textbox1.text ,有个button1 子窗体:Form2  ,有个 textbox1.text ,有个button1 修改Form1 的textbox1. ...

  5. 【BZOJ4006】【JLOI2015】管道连接

    Description 传送门 Solution 题目要求相同颜色的点必须在一个连通块中,但会有多个颜色同属一个连通块使得解更优的情况. 想一想DP能否行得通:设\(g_i\)表示已考虑颜色状态为\( ...

  6. 使用IPMI控制/监控Linux服务器

    1       IPMI简述 IPMI提供了很多丰富功能,我使用的功能,说得大白话一点,就是: 1.获取本设备的硬件信息:包括CPU和主板的温度.电压.风扇转速. 2.在设备A上,通过命令,控制远程设 ...

  7. 我们为什么要迁移PHP到HHVM

    我们为什么要迁移PHP到HHVM 程序员日志 · 2014-12-26 18:33 简介 该调研是2013年10月份做的,目标是寻找更好的PHP引擎,来代替百度各产品线正在使用的PHP 5.2. 环境 ...

  8. Backbone学习总结

    Backbone中文学习文档:http://www.css88.com/doc/backbone/ 来到公司已经有一段时间了,到现在深深的感觉到自己的能力弱的像只周黑鸭,又干涩又黝黑,充满了麻(手麻脑 ...

  9. c++11 时间类 std::chrono

    概念: chrono库:主要包含了三种类型:时间间隔Duration.时钟Clocks和时间点Time point. Duration:表示一段时间间隔,用来记录时间长度,可以表示几秒钟.几分钟或者几 ...

  10. 列表批量删除和单个删除共用一个方法传递集合到Controller

    前台方法(前台部分用的bootstrap): 后台Controller: 这里的id实际就是前台传过来的集合,这种方式,后台的 集合接收变量名称可以随意起名,因为前台传过来的就是一个集合,本身就没有名 ...