zoukankan      html  css  js  c++  java
  • 动态点分治学习小记

    动态点分治学习小记

    今天做了两道动态点分治的题,再加上前面做的三道,感觉有了些感觉,简单的记一下吧

    学习动态点分治的前提是有良好的点分治基础

    性质

    点分树有很好的性质,如子树 siz 和是 (Theta(nlog n)) 级别的,高度是严格 (Theta(log n))

    所以说在点分树上,你可以记录每个点的子树信息,查询的时候暴力跳即可

    那么先看看几道题目会有更深的理解

    BZOJ 震波

    动态点分治模板题

    问距离 x 点不超过 k 的点权和,单点修改点权,所有边权为 1

    如何理解点分治?考虑点分治的过程,可以看做一个点控制着一个联通块,然后将它断开,让剩下的点控制剩下的部分

    要维护什么信息,一是和它距离不超过 k 的点且在它控制的联通块内的点权和,二是和它父亲(点分治父亲)距离不超过 k 的点且在它联通块的点权和

    要怎么统计,我们臆想一下,我们要统计整棵树对 x 的答案,一开始什么也没统计,现在从 x 开始跳,先将 x 控制的联通块统计贡献,然后跳向点分树的父亲,但是显然父亲的块包含了它自己,这样会统计重复,那么我们统计的第二个信息就有用了,我们容斥一下将自己的贡献删掉即可,这样我们可以得到一个更大联通块的贡献,继续跳就行了

    仔细思考一下,为什么这样跳可以,建点分树的意义何在

    控制联通块是可以随便选点的,考虑一个极端情况,我们让每个点控制整棵树,也就是每个点为根记录第一个信息,显然询问时直接查询即可,但复杂度明显是 (Theta(n^2)) 的,进一步考虑,让根节点控制整颗树,每个点控制根节点对应儿子的子树,那么只需要第一次统计一下自己的块,然后再和根节点容斥一下即可,这样我们也就发现了一个重要信息,两个联通块是可以合并查答案的,只需合并时容斥减一下即可,我个人认为据此才产生了动态点分治

    HNOI 开店

    和上题几乎完全相同

    Ynoi成都七中

    这题比较巧妙的

    每个点有个颜色,问只出现编号在 [l, r] 的点和 x 形成的联通块中有多少种颜色

    可以看看原题目

    是联通块问题,所以可以考虑动态点分治

    考虑一个联通块,可以找到点分树最浅的点,那么这个点控制的联通块完全包含 x 所在的联通块

    那么我们只要考虑所有点和那个点连起来即可

    那么记录所有点到那个点路径上编号的最大最小值,可以连起来显然是要求 [l, r] 包含它

    数颜色经典问题,树状数组加离线即可

    话说这题好妙啊,下次见到也不会做吧

    其他

    写到这里有些懒了,就简单过一下

    捉迷藏

    开三个堆维护即可

    幻想乡战略游戏

    好像是动态维护带权重心,从根节点一直跳即可

  • 相关阅读:
    Trie树详解及其应用
    最长回文字符串_Manacher算法_(O(n))
    设置VisualStudio以管理员身份运行
    wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法
    data:image字符转byte[]
    ID为XXXX的进程当前未运行
    在Windows2003 server 64位系统上使用ArcEngine开发的WCF服务
    关于position的relative和absolute分别是相对于谁进行定位的
    sql语句进行写数据库时,字符串含有'的处理方式
    EF中关于日期字值的处理
  • 原文地址:https://www.cnblogs.com/Hs-black/p/13356935.html
Copyright © 2011-2022 走看看