随机跳的。

树上维护序列,显然树剖。维护异或,显然 01trie

01trie 维护区间异或,显然可持久化一下。

看到时限很大,显然可以双 log

于是跑一边树剖,再根据 id 暴力建一个 可持久化01trie,单操 \(\mathrm{O(\log n \log w)}\)

(当然可以树上差分优成 \(\mathrm{O(\log w)}\),但是不想写了。)

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )
#define dop(i, a, b) for (int i = (a); i > (b); i -- ) using namespace std; using LL = long long;
using PII = pair<int, int>;
using PLL = pair<LL, LL>; int read() {
int f = 1, s = 0; char ch = getchar();
for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') f = -1;
for (; ch >= '0' && ch <= '9'; ch = getchar()) s = (s << 1) + (s << 3) + (ch ^ 48);
return s * f;
} const int N = 100010, M = N << 1;
const long long INF = 1 << 30; int h[N], e[M], ne[M], idx;
int n, m, w[N], nw[N], top[N];
int son[N], sz[N], id[N], cnt;
int fa[N], dep[N]; struct node {
node *s[2]; int maxid;
node() { s[0] = s[1] = NULL; maxid = 0; }
}*root[N], pool[N << 5], *tail; // 开个内存池会快很多诶 void add(int a, int b) {
e[ ++ idx] = b, ne[idx] = h[a], h[a] = idx;
} // ------------ tree cut ----------------
void dfs1(int u, int father, int depth) {
dep[u] = depth, fa[u] = father, sz[u] = 1;
for (int i = h[u]; i; i = ne[i]) {
int j = e[i];
if (j == father) continue;
dfs1(j, u, depth + 1);
sz[u] += sz[j];
if (sz[son[u]] < sz[j]) son[u] = j;
}
}
void dfs2(int u, int t) {
top[u] = t, id[u] = ++ cnt, nw[cnt] = w[u];
if (son[u]) dfs2(son[u], t); for (int i = h[u]; i; i = ne[i]) {
int j = e[i];
if (j == fa[u] || j == son[u]) continue;
dfs2(j, j);
}
} // ------------- 01trie --------------- void build() {
tail = pool;
node *u = root[0] = new(tail ++ ) node();
dep(i, 30, 0) u -> s[0] = new(tail ++ ) node(), u = u -> s[0];
}
void insert(int x) {
node *u = root[x] = new(tail ++ ) node(), *p = root[x - 1];
int v = nw[x];
dep(i, 30, 0) {
if (p) *u = *p;
u -> maxid = max(u -> maxid, x);
int t = (v >> i) & 1; u -> s[t] = new(tail ++ ) node();
u = u -> s[t]; p = p ? p -> s[t] : NULL;
}
u -> maxid = max(u -> maxid, x);
}
LL query(node *u, int x, int lim) {
dep(i, 30, 0) {
int t = (x >> i) & 1;
if (u -> s[t ^ 1] && u -> s[t ^ 1] -> maxid >= lim) u = u -> s[t ^ 1];
else u = u -> s[t];
}
return (LL)x ^ nw[u -> maxid];
}
LL query(int u, int v, int z) {
LL res = -INF;
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) swap(u, v);
res = max(res, query(root[id[u]], z, id[top[u]]));
u = fa[top[u]];
}
if (dep[u] < dep[v]) swap(u, v);
res = max(res, query(root[id[u]], z, id[v]));
return res;
} int main() {
n = read(), m = read();
for (int i = 1; i <= n; i ++ )
w[i] = read();
for (int i = 1, a, b; i < n; i ++ ) {
a = read(), b = read();
add(a, b), add(b, a);
} dfs1(1, -1, 1), dfs2(1, 1); build();
for (int i = 1; i <= n; i ++ )
insert(i); while (m -- ) {
int op = read(), x = read(), y, z;
if (op == 1) {
z = read();
printf("%lld\n", query(root[id[x] + sz[x] - 1], z, id[x]));
}
else {
y = read(), z = read();
printf("%lld\n", query(x, y, z));
}
}
return 0;
}

Luogu P4592 [TJOI2018]异或 做题记录的更多相关文章

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

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

  2. 退役II次后做题记录

    退役II次后做题记录 感觉没啥好更的,咕. atcoder1219 历史研究 回滚莫队. [六省联考2017]组合数问题 我是傻逼 按照组合意义等价于\(nk\)个物品,选的物品\(\mod k\) ...

  3. FJOI2017前做题记录

    FJOI2017前做题记录 2017-04-15 [ZJOI2017] 树状数组 问题转化后,变成区间随机将一个数异或一,询问两个位置的值相等的概率.(注意特判询问有一个区间的左端点为1的情况,因为题 ...

  4. UOJ 做题记录

    UOJ 做题记录 其实我这么弱> >根本不会做题呢> > #21. [UR #1]缩进优化 其实想想还是一道非常丝播的题目呢> > 直接对于每个缩进长度统计一遍就好 ...

  5. project euler做题记录

    ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{a ...

  6. Sam做题记录

    Sam做题记录 Hihocoder 后缀自动机二·重复旋律5 求一个串中本质不同的子串数 显然,答案是 \(\sum len[i]-len[fa[i]]\) Hihocoder 后缀自动机三·重复旋律 ...

  7. 退役IV次后做题记录

    退役IV次后做题记录 我啥都不会了.... AGC023 D 如果所有的楼房都在\(S\)同一边可以直接得出答案. 否则考虑最左最右两边的票数,如果左边>=右边,那么最右边会投给左边,因为就算车 ...

  8. 退役III次后做题记录(扯淡)

    退役III次后做题记录(扯淡) CF607E Cross Sum 计算几何屎题 直接二分一下,算出每条线的位置然后算 注意相对位置这个不能先搞出坐标,直接算角度就行了,不然会卡精度/px flag:计 ...

  9. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  10. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

随机推荐

  1. oracle-组合索引字段位置与查询效率之间的关系

    Oracle索引组合字段的位置不同,当查询条件不能覆盖索引时,影响查询效率.查询条件是不是索引字段的第一列影响执行计划,实验验证 实验1:查询条件为组合索引的第一列--创建测试表 create tab ...

  2. Python的23种设计模式

    文章目录 Python与设计模式--前言 一 什么是设计模式 二 为什么要有设计模式 三 有那些设计模式 创建类设计模式(5种) 结构类设计模式(7种) 行为类设计模式(11种) 四 设计模式与架构, ...

  3. Convolutional neural network (CNN)–extreme learning machine (ELM)

    1. 介绍 论文:(2020)Neural networks for facial age estimation: a survey on recent advances. 地址: http://li ...

  4. 01-linux - kvm

    配置linux kvm 逻辑卷 # df -h # fdisk -l | grep dev # pvs # pvcreate /dev/sdg # pvs # vgcreate oradata /de ...

  5. SOA认知和方法论

    1 前言 1.1 架构分类 在软件设计领域,企业架构通常被划分为如下五种分类: 如何理解架构分类依据及其彼此之间的关系?业务是企业赖以生存之本,因此业务架构是基础.是灵魂,其他一切均是对业务架构的支撑 ...

  6. (Good topic)回文数(3.13 leetcode每日打卡)

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121输出: true 示例 2: 输入: -121输出: false解释: 从左向右读, ...

  7. LOG日志系统

    # coding=utf-8 import datetime import logging import os import sys from logging.handlers import Time ...

  8. 请查收,本周刷屏的两大热点「GitHub 热点速览」

    如果你逛 HackerNews 或者是推特,你一定会被 multipleWindow3dScene 这个跨窗口渲染项目的成果刷屏,毕竟国内的技术平台上也出现了不少的模仿项目.另外一个热点,便是你在白板 ...

  9. ABAP 泰国凭证批导 报错 F51 192 输入一个业务场景

    泰国凭证批导报错 F51 192 输入一个业务场景 方案一: 方案二:  ID_BUPLA  用户参数

  10. NodeJS下载安装

    一.什么是NodeJS? NodeJS是一个开源,跨平台的JavaScript运行环境 二.NodeJS安装包下载 1.打开网址:Node.js (nodejs.org) 2.下载稳定版本 三.Nod ...