P2590 树的统计 题目解析
一题面一棵树上有 n 个节点编号分别为 1 到 n每个节点都有一个权值 w。我们将以下面的形式来要求你对这棵树完成一些操作I.CHANGE u t: 把结点 u 的权值改为 t。II.QMAX u v: 询问从点 u 到点 v 的路径上的节点的最大权值。III.QSUM u v: 询问从点 u 到点 v 的路径上的节点的权值和。注意从点 u 到点 v 的路径上的节点包括 u 和 v 本身。对于每个QMAX或者QSUM的操作每行输出一个整数表示要求输出的结果二理解考虑线段树结合树链剖分按照顺序梳理1输入树dfs1函数得出基本信息即 fa每个点的父节点 sz每棵子树大小 depth深度 maxson每个点的重孩子进行重链剖分2dfs2划分重链1得出3个新基本信息即 top每个点所在链的链头 dfn每个点的dfs序 fn每个dfs序所对应的点的编号2分链 重孩子的链头自己链头 轻孩子单开一条链3对dfs序构建线段树 dfs序通用性质把树压成一维数组同一条重链上所有节点的dfn编号是一段连续区间 可以把树上路径转成线段树区间任意两点路径能够拆成多段连续区间 所以可以使用线段树维护树上路径其中pushupbuild普通对于线段树查询的query和update均为模板代码4对于链查询的query_chain 求LCA模板代码如下 其中跳链步骤与之相同int LCA(int x,int y) { while(top[x]!top[y]) { if(depth[top[x]]depth[top[y]]) swap(x,y); xfa[top[x]]; } if(depth[x]depth[y]) return x; else return y; }借助条链把 x 到 y 的树上路径拆成若干条完整重链 最后同链的一段三代码详细解析在注释#includebits/stdc.h #define ll long long using namespace std; const int N3e45; int a[N],fn[N],fa[N],sz[N],depth[N],dfn[N],top[N],maxson[N],tot,ans,n,q; struct node { int L,R,maxx,sum; } st[N2]; vectorint g[N]; void pushup(int root) { st[root].maxxmax(st[root1].maxx,st[root1|1].maxx); st[root].sumst[root1].sumst[root1|1].sum; } void build(int root,int L,int R) { st[root].LL; st[root].RR; if(LR) { st[root].maxxst[root].suma[fn[L]];//注意对dfs序打线段树要反映射回编号 return ; } int midLR1; build(root1,L,mid); build(root1|1,mid1,R); pushup(root); } void update(int root,int L,int R,int k,int val) { if(LR) { st[root].maxxst[root].sumval; return ; } int midLR1; if(kmid) update(root1,L,mid,k,val); else update(root1|1,mid1,R,k,val); pushup(root); } void dfs1(int u,int f) {//作用求重儿子、sz、depth、fa fa[u]f,sz[u]1,depth[u]depth[f]1; for(int v:g[u]) { if(vf) continue; dfs1(v,u); sz[u]sz[v]; if(!maxson[u]||sz[maxson[u]]sz[v]) { //v是否是u的重孩子 maxson[u]v; } } } void dfs2(int u,int t){//作用划分重链 t即为此时u点对应的链头 top[u]t; dfn[u]tot; fn[tot]u;//反映射标记dfs序对应的编号 if(maxson[u]){//有重孩子优先走重孩子 dfs2(maxson[u],t);//链头不变重孩子自动成链 for(int v:g[u]){ if(v!maxson[u]v!fa[u]){//是轻孩子不重走 dfs2(v,v);//轻孩子单开链链头是自己 } } } } int query(int root,int L,int R,int l,int r,int type){ if(type1){ if(lLRr){ return st[root].maxx; } int midLR1; if(rmid) return query(root1,L,mid,l,r,type); else if(lmid) return query(root1|1,mid1,R,l,r,type); else return max(query(root1,L,mid,l,r,type),query(root1|1,mid1,R,l,r,type)); } else{ if(lLRr){ return st[root].sum; } int midLR1; if(rmid) return query(root1,L,mid,l,r,type); else if(lmid) return query(root1|1,mid1,R,l,r,type); else return query(root1,L,mid,l,r,type)query(root1|1,mid1,R,l,r,type); } } int query_chain(int x,int y,int type) { if(type1) ans-0x3f3f3f3f; else ans0; while(top[x]!top[y]) { if(depth[top[x]]depth[top[y]]) swap(x,y); int tmpquery(1,1,n,dfn[top[x]],dfn[x],type);//路径的一部分 if(type1) ansmax(ans,tmp); else anstmp; xfa[top[x]];//跳到不同的链直到共链 } if(depth[x]depth[y]) swap(x,y); int tmpquery(1,1,n,dfn[y],dfn[x],type);//对dfs序打线段树此时跳完后的x和y共链,这是最后的那部分路径 if(type1) ansmax(ans,tmp); else anstmp; return ans; } int main() { scanf(%d,n); for(int i1; in; i){ int aa,bb; scanf(%d%d,aa,bb); g[aa].push_back(bb); g[bb].push_back(aa); } for(int i1;in;i) scanf(%d,a[i]); dfs1(1,0); dfs2(1,1);//1的链头是自己 build(1,1,n); scanf(%d,q); while(q--){ char op[10]; int x,y; scanf(%s%d%d,op,x,y); if(op[0]C){ update(1,1,n,dfn[x],y);//对dfs序打的线段树所以找的是dfn[x] } else{ if(op[1]M){ printf(%d\n,query_chain(x,y,1)); } else{ printf(%d\n,query_chain(x,y,0)); } } } }好久没干这活了大肘子欢迎指正

相关新闻

AI艺术生成器技术解析:从扩散模型到提示词工程实战指南

AI艺术生成器技术解析:从扩散模型到提示词工程实战指南

1. 从像素到诗意:AI艺术生成器的进化之路几年前,当人们谈论“AI艺术”时,脑海里浮现的可能是那些模糊、扭曲、带有明显算法痕迹的怪异图像。但今天,情况已经截然不同。你或许已经见过那些足以媲美专业画师、摄影师的AI作品&#x…

2026/7/10 5:55:24 阅读更多 →
VS Code GitHub Copilot插件中配置 DeepSeek 模型

VS Code GitHub Copilot插件中配置 DeepSeek 模型

VS Code GitHub Copilot 配置 DeepSeek 模型指南 在 VS Code 的 GitHub Copilot 中配置 DeepSeek 模型,目前最主流、官方推荐的方式是通过安装特定的 VS Code 扩展来实现。GitHub Copilot 本身并不直接支持更换模型,但这些扩展可以作为“桥梁”&#xf…

2026/7/10 5:55:24 阅读更多 →
STM32L021K4驱动EPT-14A4005P压电扬声器的低功耗警报方案

STM32L021K4驱动EPT-14A4005P压电扬声器的低功耗警报方案

1. EPT-14A4005P压电扬声器特性解析EPT-14A4005P是Sanco Electronics推出的一款高性能压电扬声器,专为警报和音频信号应用设计。这款压电扬声器采用特殊的压电陶瓷材料,当施加交变电压时,压电材料会产生机械振动,从而发出声音。与…

2026/7/10 5:51:23 阅读更多 →

最新新闻

JFFS2/Squashfs 编程器固件修改:Ubuntu 22.04 下 3 种文件系统挂载与编辑实战

JFFS2/Squashfs 编程器固件修改:Ubuntu 22.04 下 3 种文件系统挂载与编辑实战

JFFS2/Squashfs 编程器固件修改:Ubuntu 22.04 下 3 种文件系统挂载与编辑实战嵌入式设备固件修改是硬件开发者与极客们绕不开的挑战。当我们需要定制路由器、随身WiFi等设备的系统功能时,直接操作编程器固件往往是最彻底的解决方案。本文将基于Ubuntu 22…

2026/7/10 6:35:53 阅读更多 →
MAXIM DS4424 电流型DAC实战:在U.2 SSD测试平台实现±10%电压拉偏

MAXIM DS4424 电流型DAC实战:在U.2 SSD测试平台实现±10%电压拉偏

MAXIM DS4424 电流型DAC在U.2 SSD测试平台中的精密电压拉偏实战1. 电流型DAC的工程价值与选型考量在高速存储设备测试领域,电源电压的精密调节一直是工程师面临的挑战。传统电阻分压方案存在调节速度慢、精度受限、无法动态调整等固有缺陷。MAXIM DS4424作为一款7位…

2026/7/10 6:35:53 阅读更多 →
从LLM论文到生产系统:推理延迟优化的量化实验方法

从LLM论文到生产系统:推理延迟优化的量化实验方法

从LLM论文到生产系统:推理延迟优化的量化实验方法 一、"论文里的3秒,生产环境的15秒"——学术基准与真实场景的鸿沟 LLM 推理延迟是产品体验的致命指标。在学术论文中,最优模型的推理延迟通常被报告在 1-3 秒的区间。但当同样的模…

2026/7/10 6:33:53 阅读更多 →
STM32与MAX77654电源管理实战:低功耗设计要点

STM32与MAX77654电源管理实战:低功耗设计要点

1. 项目背景与核心需求在嵌入式系统设计中,电源管理始终是决定产品可靠性和续航能力的关键因素。我最近为一个工业物联网终端设备设计的电源系统,需要同时满足以下严苛要求:主控采用STM32L151ZD低功耗MCU外围传感器包含3.3V和5V两种供电需求系…

2026/7/10 6:33:53 阅读更多 →
Python 3.12 内置异常深度解析:从FileNotFoundError到OSError的10+子类实战

Python 3.12 内置异常深度解析:从FileNotFoundError到OSError的10+子类实战

Python 3.12 文件操作异常全指南:从基础捕获到精准处理1. Python异常处理的核心逻辑Python的异常处理机制远不止简单的try-except块。理解异常处理的完整逻辑流程,才能真正写出健壮的代码。当异常发生时,Python解释器会按照以下顺序处理&…

2026/7/10 6:33:53 阅读更多 →
Unity URP-PSX插件:用现代管线精准复刻PS1复古图形风格

Unity URP-PSX插件:用现代管线精准复刻PS1复古图形风格

1. 项目概述:当现代管线邂逅复古灵魂最近在独立游戏开发圈里,复古风潮又刮回来了,而且这次刮得有点“硬核”。大家不再满足于简单的像素风滤镜,而是开始追求那种90年代末期PlayStation 1(PSX)游戏特有的、带…

2026/7/10 6:31:52 阅读更多 →

日新闻

STM32与LTC1864高精度ADC的SPI通信实现

STM32与LTC1864高精度ADC的SPI通信实现

1. 项目背景与核心需求在工业控制和嵌入式系统开发中,模拟信号与数字系统的无缝集成一直是工程师面临的关键挑战。LTC1864作为一款16位高精度ADC转换器,配合STM32F101ZG这类主流微控制器,能够构建高性能的模拟信号采集系统。这种组合特别适合…

2026/7/10 0:03:07 阅读更多 →
猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案

猫抓插件:浏览器资源嗅探与视频下载的终极解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页视频无法下载而烦恼吗&am…

2026/7/10 0:05:09 阅读更多 →
直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

直流有刷电机驱动方案:TC78H653FTG与MKV46F256VLH16应用

1. 直流有刷电机驱动方案概述在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H653FTG作为东芝推出的新一代H桥驱动器,与MKV46F256VLH16微控制器配合使用&#xff0c…

2026/7/10 0:05:09 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻