[HDU4757][可持久化Trie][LCA]Tree[好题]

hdu 4757 Tree(可持久化字典树) 题目链接:hdu 4757 Tree 题目大意:给定一棵树,每个节点有一个值,现在有Q次询问,每次询问u到v路径上节点值与w亦或值的最大值。 解题思路:刚开始以为是树链剖分,其实树链剖分只是用来求LCA(可以不用树链剖分)。 可持久化字典树,在每次插入的同时,不修改原先的节点,而是对所有修改的节点复制一个新的节点,并且在新的节点 上做操作,这样做的目的是能够获取某次修改 阅读详情

Orz

题意:

    给你一棵有点权的有根树。给出多组询问 (x,y,z) ,每次询问一条路径 (x,y) 上所有数异或 z 的最大值。

题解:

    如果范围不是路径而是一个集合的话怎么做?按写成二进制建立Trie树再进行贪心。本题类似,不过需要建立可持久化的Trie树(树上每个节点对应一个Trie树根节点)。每个节点的Trie树都是由父节点的Trie树插入它的二进制得到。

    求出两个询问点的LCA,把路径拆成两部分分别询问。

    同时,不想手写栈的同学需要黑科技手动扩栈。

(不要随便看代码。不要随便看代码。不要随便看代码。重要的事情说三遍。 )

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;

//Global Variables & Definitions
template<class T>
T tmax(T a, T b) {
    return a > b ? a : b;
}

#define MS(arr, x) memset(arr, x, sizeof(arr))
#define MAXN 100010

int N, M;
int A[MAXN];

int Bits[20];

#define BLEN 15
//End Global Variables & Definitions

//Map
#define MAXE 200020
struct edge {
    int v, next;
} e[MAXE];

int ecnt;
int h[MAXN];

inline void init_edge() {
    MS(h, ecnt = -1);
}

void adde(int u, int v) {
    ++ecnt;
    e[ecnt].v = v;
    e[ecnt].next = h[u];
    h[u] = ecnt;
}
//End Map

//Trie
#define MAXT 2000020
#define SIZE 2

int ch[MAXT][SIZE];
int cnt[MAXT];
//int v[MAXT]

int ncnt;
int newnode() {
    ++ncnt;
    ch[ncnt][0] = ch[ncnt][1] = cnt[ncnt] = 0;
    //v[ncnt] = 0;
    return ncnt;
}

int copy(int u) {
    int v = newnode();
    ch[v][0] = ch[u][0];
    ch[v][1] = ch[u][1];
    cnt[v] = cnt[u];

    return v;
}

void Insert(int _root, int d) {
    int p = _root;

    for(int i = BLEN;~i;--i) {
        int c = (d & Bits[i]) > 0;
        p = ch[p][c] = copy(ch[p][c]);
        ++cnt[p];
    }
}
//End Trie

//Tree
int root[MAXN];

int f[MAXN];
int vis[MAXN];
int l[MAXN], r[MAXN];

void dfs(int u) {
    vis[u] = 1;

    if(~f[u])
        root[u] = copy(root[f[u]]);
    else
        root[u] = newnode();
    Insert(root[u], A[u]);

    int rptr = -1, vv;
    for(int i = h[u];~i;i = e[i].next) if(!vis[vv = e[i].v]) {     
        if(~rptr) r[rptr] = vv;
        else l[u] = vv;

        f[rptr = vv] = u;
        dfs(vv);
    }
}

void init_dfs() {
    MS(l, -1);
    MS(r, -1);
    MS(f, 0); f[1] = -1;
    MS(vis, 0);
}

int clk;
int fir[MAXN];
int seq[MAXN * 2];
int depth[MAXN];

void ldfs(int u, int d) {
    depth[u] = d;

    seq[clk] = u;
    fir[u] = clk;
    ++clk;

    for(int i = l[u];~i;i = r[i]) {
        ldfs(i, d + 1);

        seq[clk++] = u;
    }
}
//End Tree

//Main Structure
int rmq[MAXN * 2][18];

int calc(int a, int b) {
    return depth[a] < depth[b] ? a : b;
}

void init_rmq() {
    int NN = N * 2 - 1;

    for(int i = 0;i < NN;++i) rmq[i][0] = seq[i];

    for(int j = 1;j < 18;++j) {
        int l = 1 << j;
        int hl = l >> 1;

        for(int i = 0;i + l <= NN;++i) rmq[i][j] = calc(rmq[i][j - 1], rmq[i + hl][j - 1]);
    }
}

int lca(int a, int b) {
    a = fir[a]; b = fir[b];
    if(a > b) swap(a, b);

    if(a == b) return rmq[a][0];

    int k = 0, temp = 1;
    while(a + temp <= b) { ++k; temp <<= 1; }
    --k; temp >>= 1;

    return calc(rmq[a][k], rmq[b - temp + 1][k]);
}

int ansr(int u, int z) {
    int p = root[u], ans = 0;

    for(int i = BLEN;~i;--i) {
        int c = (z & Bits[i]) > 0;

        if(ch[p][c ^ 1]) {
            p = ch[p][c ^ 1];

            ans += Bits[i];
        } else {
            p = ch[p][c];
        }
    }

    return ans;
}

int ans(int f, int s, int z) {
    if(!~f) return ansr(s, z);

    int pf = root[f], ps = root[s];

    int ans = 0;
    for(int i = BLEN;~i;--i) {
        int c = (z & Bits[i]) > 0;

        if(ch[ps][c ^ 1] && (!ch[pf][c ^ 1] || cnt[ch[ps][c ^ 1]] > cnt[ch[pf][c ^ 1]])) {
            ps = ch[ps][c ^ 1];
            pf = ch[pf][c ^ 1];

            ans += Bits[i];
        } else {
            ps = ch[ps][c];
            pf = ch[pf][c];
        }
    }

    return ans;
}

inline void ir() {
    ncnt = 0;
    ch[0][0] = ch[0][1] = cnt[0] = 0; //pseudo-null

    for(int i = 1;i <= N;++i) scanf("%d", &A[i]);

    int u, v;
    init_edge();
    for(int i = 1;i < N;++i) {
        scanf("%d%d", &u, &v);

        adde(u, v);
        adde(v, u);
    }

    init_dfs();
    dfs(1);

    clk = 0;
    ldfs(1, 0);

    init_rmq();
}

void solve() {
    ir();

    int x, y, z;
    for(int i = 0;i < M;++i) {
        scanf("%d%d%d", &x, &y, &z);
        int l = lca(x, y);
        printf("%d\n", tmax(ans(f[l], x, z), ans(f[l], y, z)));
    }
}

inline void g_ir() {
    for(int i = 0;i < 20;++i) Bits[i] = 1 << i;
}

int main() {
    g_ir();

    while(~scanf("%d%d", &N, &M)) solve();
    return 0;
}
从申请到推理:Meta Llama 3 8B模型Hugging Face本地部署与简易聊天机器人搭建指南 本文详细介绍了如何在本地部署Meta Llama 3 8B模型并搭建简易聊天机器人。从申请模型访问权限、配置Hugging Face环境,到模型加载与量化技巧,再到构建Web对话界面和性能优化实战技巧,全面覆盖了NLP模型本地部署的关键步骤。适合开发者在普通开发机上快速实现AI对话应用。 阅读详情

相关推荐

HDU 4757 Tree(可持久化01trie+LCA)

传送门 给定无根树,带点权,m次询问,每次询问给出x,y,z,问x到y的简单路径上的点,与z进行异或运算,结果最大是多少。 求与给定常数的异或最大值,妥妥的01字典树。 我们可以把x,y的简单路径拆分成两条链 x->lca(x,y); y->lca(x,y); 分别在两条链上找答案然后取最大值。 如何找答案呢,先假设根节点是1,我们可以对每个节点建一个01trie,表示其到1的路径上的点建成的01trie,由于该节点与其父节点相比只多了一条链,所以可以建可持久化01trie。 查询: 在root

矮纸斜行闲作草 262

HDU 4757 可持久化字典树(Trie)

【题目大意】     一颗无根树,每个节点有权值,每次提问x,y,z,回答节点x到y的唯一路径上xor z的最大值。 【分析】     Trie保存每个2进制位,然后类似贪心的遍历一次即可,遍历的时候,用x,y,lca,falca的各个版本来维护是否有串即可。 【代码】 /*********************** ID:Ciocio LANG:C++

Ciocio 1475

python 中心线提取_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就...

weixin_42204453的博客 4290

HDU - 4757 Tree(可持久化字典树)

题目vj链接 题面: 题意: 给定一棵树,边有边权。 m次询问,每次给定 x,y,z。求 x 到 y 的简单路径所经过的点的点权与 z 异或的最大值。 题解: 可持久化字典树。 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #include<string

_Griefs 214

别再死记硬背了!用51单片机的AD/DA和PWM,亲手做个简易示波器信号发生器

本文详细介绍了如何利用51单片机的PWM和AD/DA功能制作简易示波器信号发生器。通过PWM模拟DAC输出波形,结合XPT2046 ADC进行信号测量,实现方波、三角波和正弦波的生成与显示。项目不仅成本低廉,还能帮助电子爱好者深入理解51单片机的核心功能,是理论与实践结合的绝佳案例。

weixin_28675839的博客 265

多智能体强化学习中的Trust Region技术:HATRPO与HAPPO深度解析

本文深度解析多智能体强化学习中的Trust Region技术,重点探讨HATRPO(异质智能体信任区域策略优化)与HAPPO(异质智能体近端策略优化)两种先进算法。通过数学架构与工程实现细节,揭示其在解决联合策略空间爆炸、信用分配等挑战中的优势,并分享实际部署中的优化技巧与前沿进展。

weixin_29072299的博客 191

hdu4757(可持久化 Trie )

hdu4757 题意 给出一棵树,每个节点有权值,每次查询节点 \((u, v)\) 以及 \(x\) ,问 \(u\) 到 \(v\) 路径上的某个节点与 \(x\) 异或最大的值是多少。 分析 Trie 的新姿势! 如果直接问 \(x\) 与某个区间中哪个数异或后最大,那么直接把区间所有数转化成二进制数(从高到低位,保证长度相同,前面不足补 \(0\) )插入到字典树中,然后查询将每一位都取反...

weixin_34349320的博客 236

YOLO26改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 210

hdu4757 Tree(可持久化字典树+lca)

题意: 给一棵n个节点的树,每个点有点权 q组询问,每组询问给x,y,v,问x到y路径上的点异或v的最大值是多少 数据范围:n,q<=1e5 解法: 树上路径用lca搞,最大异或和用trie搞,在树上建可持久化trie就行了 code: #include<bits/stdc++.h> using namespace std; const int N=1e5+5; const int maxd=20; struct Node{ int a[N<<6][2];//节点和边

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 319

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

YOLOv8改进策略【损失函数篇】| 替换Powerful-IoU(PIoU),增强对中等质量锚框的关注力,引导锚框更直接、高效地回归

现有基于IoU的损失函数存在不合理的惩罚因子,导致锚框在回归过程中出现面积扩大的问题,使得回归效率降低、收敛速度变慢。同时,这些损失函数在反映锚框与目标框之间的差异、考虑目标框大小以及某些情况下的性能表现等方面存在局限性。在目标检测任务中,边界框回归的损失函数对检测性能至关重要。Powerful-IoU(PIoU)及其升级版PIoU v2正是为解决现有损失函数存在的问题而设计的。本文利用PIoU改进YOLOv8的损失函数,提高模型精度。

Limiiiing的博客 672

BZOJ3261 最大异或和 可持久化Trie模板题

题目点这里 他要求一个区间内的位置到结尾处异或和的最大值,我们转换一下,设S[i]表示前i个位置上的数异或起来的结果,即异或值的前缀和。 于是题目的要求a[p] ^ a[p+1] ^… a[n] ^ x = s[p-1] ^ s[n] ^ x.。于是题目就相当于变成了,已知一个值val = s[n]^x,求一个位置p满足 l-1 =< p <= r-1,使得s[p] ^ val的这个值最大 这样的话我们只需要将trie可持久化后,每次区间询问位置合法(即两个版本间是否有合法位置)是查询val每一

forward77 223

Vue3 - Element Plus 组件库 Tabs 标签页右侧区域插入按钮,<el-tabs> / <el-tab-pane> 选项卡组件右侧自定义插槽内容教程(右边区域添加自定义按钮功能区)

vue3,elementplus,tabs选项卡如何在插槽按钮,tabs标签页组件怎么自定义右侧内容,vue3elementplustabs组件右侧插槽按钮,element-plus在el-tabs组件的最右侧添加按钮,如何在选项卡右边加入按钮搜索框等内容,哪个属性能在tab选项卡右侧插入自定义按钮,在el-tabs组件最右侧添加按钮,vue3el-tabs组件怎么自定义右侧插槽内容,Tabs标签页右侧自定义插槽,ElementPlusTab右边加按钮,el-tabs组件自定义右侧按钮,在E

🏆 前端领域优质创作者 7016

hdu 4757 Tree 可持久化字典树

hdu 4757 Tree 可持久化字典树

cfhgcvb的博客 168

IGCT 测试原理概述

IGCT(Integrated Gate-Commutated Thyristor,集成门极换流晶闸管)是一种高功率半导体器件,基于门极可关断晶闸管(GTO)的原理,但通过集成门极驱动单元和优化结构(如硬驱动技术),实现了更低的导通损耗、更快的开关速度和更高的可靠性。它适用于中高压大功率应用,如高压直流输电(HVDC)、中压变频器和模块化多电平变换器(MMC)。IGCT 的结构为四层 p-n-p-n 器件,门极电流控制导通和关断,阳极电流在关断时快速换流至门极,通常在 1 μs 内完成。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 234

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HDU 4757 Tree (倍增算法求LCA + 可持久化Trie树)

题目大意: 就是现在给出一棵树, 结点个数不超过10W, 每个节点上有一个不超过2^16的非负整数, 然后10W次询问, 每次询问两个节点的路径上的所有数中异或上给出的数的最大值 大致思路: 刚开始做这个题想的是树链剖分之后用线段树套Trie树来做...结果悲剧地MLE了... 另外那样做得话复杂度其实是比较大的...每次询问都是16*(logn)*logn级别的.. 后来发现是

Gatevin的专栏 1507

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

HDU - 4757 Tree(LCA+可持久化trie树)

题目链接:点击查看 题目大意:给出一棵有有n个节点的树,每个点都有一个权值,现在给出m个查询,每次查询的形式为:x,y,z,求出从点x到点y的路径上任选一点,使其与z的异或值最大,输出异或值 题目分析:一开始看到从一个区间内任选一个点与指定的值异或取最值,立马就想到了可持久化trie树,可是这个题目是基于树上操作的,我们该怎么将树上的路径拿下来呢?其实这就涉及到了LCA,在给出两个点x和y后,...

Falcon的博客 492

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hdu4757 Tree

可持久化Trie,比赛的时候一直在想不到怎么样才可以做减法,赛后才想清楚。 首先异或最大就是在字典数上找它的按位取反,首先满足高位。 维护Trie的时候同时维护一下子树的叶子节点和,这样就可以做一个减法了,如果某棵子树没有叶子节点就意味着不能走。 #include #include #include #include #include #include #includ

Sd_Invol的专栏 3097

HDU 4757 Tree(可持久化trie)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意:给出一棵树,节点有权值。每次询问x到y的路径上与z抑或的最大值。 思路:可持久化trie。   struct Node { int c[2],cnt; }; Node a[2000005]; int cnt; int newNode() { ...

weixin_34283445的博客 120

HDU - 4757 Tree

HDU - 4757 Tree 题意:在树上每个节点都有一个权值,每次询问给出x,y和一个值z,求在树上点x到点y的路径上每个点的权值异或z之后的最大值。 思路:可持久化01字典树,利用LCA,即两段路径,x到LCA(a,b)和y到LCA(a,b),可以按dfs序来可持久化,比如root[i]可以接他的父亲即root[fa[i]]。挺有用的想法,应该可以扩展到树上主席树。 #include&l...

EDGiboy的博客 252

HDU4757 Tree (可持久化Trie)

题意:给出一棵树,每个点上有权值,有m组询问,每次询问从x到y的路径上的权值与z异或的最大值为多少。 分析:最原始的是数集是固定的,只需要对数集按照高到低位去建Trie,然后贪心匹配就可以了。这里则是对树上路径的操作,其实也是一样的,对每个节点x维护root到x的Trie,然后纪录下往左走往右走的叶子节点个数,设z=lca(x,y),那么到了个某个节点能否往某个儿子走的限制条件是 sz[ch[x...

常胜将军的博客 277

HDU 4757 Tree 可持久化trie+lca

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4757题意:给出一棵树,树上的点都有权值,每次给出一组询问x y zx\ y\ z,求从xx到yy路径上的点权值和zz异或得到的最大值思路:可持久化trietrie,在其父节点的基础上更新trietrie。查询的时候,先查询x yx\ y的lcalca,然后查询xx到lcalca路径上点权值和zz异或的最大值

弱智就要多努力 473

Tree 【HDU - 4757】【可持久化字典树】

题目链接 给你一棵N个点的树,每个点都有权值,然后给N-1条树上的边,之后有Q次询问,问u到v的这条链上的点,和给出权值z异或的最大值。 那么,就是可持久化字典树,然后再加上一个LCA即可求解该问题了,多组输入。利用树上差分,求链信息。 #include <iostream> #include <cstdio> #include <cmath> #include <string> #include <cstring> #includ..

既然弱小,就只顾变强就是了 584

hdu 4757 Tree (可持久化trie)

链接 题意: 有一棵n个节点的树,每个节点有一个权值,询问u节点到v节点的链上异或x的最大值 思路: dfs建树,对于u这个版本,它的上一个版本是它的父亲节点。然后就是查询了,这类树上询问一条链的问题,很多都是利用lca解决的。求出u,v两个点的lca,u到lca其实应该query(u,fa[lca])才行,v和lca同样。但是也可以query(u/v,lca),最后在把lca的位置单独拿...

冰柠橙的博客 256

Hdu-4757 Tree(可持久化字典树)

Problem Description   Zero and One are good friends who always have fun with each other. This time, they decide to do something on a tree which is a kind of graph that there is only one path from nod

WZJRJ28 581

HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)

Tree Time Limit: 10000/5000 MS (Java/Others)Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 1643Accepted Submission(s): 461 Problem Description Zero and...

weixin_30819163的博客 71
上一篇: [SPOJ1557][GSS2][线段树]Can you answer these queries II[好题]
下一篇: [Uva11983][线段树][扫描线]Weird Advertisement[好题]
BenjaminPMLee
博客等级 码龄12年 5粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值