给定一颗 n 个节点的带权无向树。
给出 q 个操作:
1 i w
:把第 i 条边的边权变成 w。
2 u v
:求 u→v 简单路径的边权和。
根据树上差分。
令 p→lca(x,y)。
则 u→v 简单路径的边权和为 d(u)+d(v)−2d(p)。
详见 oi-wiki。
其中 d(i) 表示 i→r 边权和的差分数组,r 为根节点。
本题需要支持修改操作,我们可以用树状数组/线段树来维护 d。
具体的,对于无向边 (u,v) 且 u 为 v 的儿子,则我们发现只对以 u 为根的这颗子树的 d 有影响。
那么我们可以先求出 dfs 序,然后就转换成了区间加,单点查询,可以用树状数组/线段树维护。
时间复杂度:O(nlogn+qlogn)。
代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具