Processing math: 100%

BZOJ3730 震波

传送门

题目大意

维护一棵树,每个点有点权,强制在线支持两种操作:

1、修改一个点的点权

2、查询距离一个点距离不超过D的点权值和。

 

题解

一道动态点分治模板好题。

先建出点分树,每个分治区重心以到重心距离为下标维护点权和,每次查询时由于要防止x同时对当前重心和当前重心的父节点有贡献,要容斥一下,在当前分治区记录当前分治区中的点对父亲分治区的贡献,每次要减去这个。

由于要执行2(N+M)logN级别的修改或查询,所以动态开点的线段树由于常数过大很可能会TLE,所以我们最好使用树状数组。那么问题来了,树状数组如何开空间?

考虑到每个重心下标的最大值要么是分治区内的点到分治区重心的距离要么是分治区内的点到父亲分治区中心的距离,则有意义的最大值要么是分治区重心的子树的最大深度,要么是分治区的直径,为了保险起见,我开了2倍的最大子树Size+1

还需注意树状数组的下标只能从1开始,而距离有可能是0,所以要特殊处理。

复杂度2(N+M)log2N为什么求lca O(1)RMQ不如树剖快啊。

不过可以采用分层记深度的方法无需预处理直接O(1)求距离,这里就不写了。

O(1)RMQ

树剖

 

posted @   OYJason  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?
点击右上角即可分享
微信分享提示