ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

点分树学习笔记

2021-07-12 20:32:26  阅读:201  来源: 互联网

标签:s2 s1 分治 笔记 点分 学习 点分树 query 树上


关于点分树的一些理解

定义与性质

点分树,就是把点分治中的每一次的重心连起来,构成一棵树。
由于重心的性质,点分治最多有 \(\lg n\) 层, 所以点分树的树高最多是 \(\lg n\)

维护

一般维护两个值 \(s1\) 和 \(s2\) ,\(s1\) 表示这个点的子树对于这个点的贡献, \(s2\) 表示这个点的子树对于这个点的父亲的贡献。\(s2\) 用于对 \(s1\) 进行容斥

每次修改时要在点分树上不断跳父亲,修改点分树上父亲的信息。

每次查询时要在点分树上不断跳父亲,询问点分树上父亲的信息,一般要用到容斥。用 \(s2\) 容斥 \(s1\)

具体看了题就理解了。

用途

一般用于静态条件下点分治可解,但是强制在线或带修的题。

注意事项

点分树上的位置关系,距离关系,父子关系,祖孙关系,和原树上不同。

luogu6329震波

标签

点分治, 树状数组

思路

先考虑不带修的情况,那这就是道点分治裸题,但是这道题要求支持修改且强制在线。那么点分治就不能用了。

所以我们要用点分树。

对于每一个节点维护两棵树状数组 (\(vector\) 存) , \(s1\) 维护距离当前点距离为 \(k\) 的点的价值和, \(s2\) 维护距离当前点的点分树上的父亲距离为 \(k\) 的点的价值和。

对于修改操作,改成增加,然后在点分树上不断跳父亲,修改 \(s1\) 和 \(s2\) 。

对于查询操作,在点分树上不断跳父亲,设询问点和父亲的距离为 \(d\) , 那么对于每一层,把答案加上 \(s1[fa[i]].query(k - d) - s2[i].query(k - d)\) 用于去重,因为当前子树已经被计算过了。

维护两棵树状数组多麻烦啊,直接 \(s1[fa[i]].query(k - d) - s1[i].query(k - d - dis(i, fa[i]))\) 或者 \(s1[fa[i]].query(k - d) - s1[i].query(k - dis(i, x))\) 多方便,然而要注意 点分树上的位置关系,距离关系,父子关系,祖孙关系,和原树上不同。 所以这样做是错误的。

Code

[ZJOI2007]捉迷藏

标签:s2,s1,分治,笔记,点分,学习,点分树,query,树上
来源: https://www.cnblogs.com/youwike/p/15003779.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有