Shu-How Zの小窝

Loading...

2 2 Day 6 分治结构+Day 7 cdq 分治与分治杂题

  • Day5之前把基础的东西听完了,Day4后面听了一段时间有点难以理解,先鸽一段时间,开day 6
  • P3350
    • 考虑每次对长度较长的边对半切开分治,记切开的这条边上的节点的集合为 \(C\)被切开的矩形的节点集合为 \(U\) 那么对于 \(C\) 中的每个节点在 \(U\) 上跑一遍单源最短路,若我们的询问节点 \((sx,sy)\)\((ex,ey)\) 在这个矩形上且被 \(C\) 分开,则对于每一组这样的起点终点,在 \(C\) 集合中枚举点 \(x\),作为中转点,求 \((sx,sy)\)\((ex,ey)\) 的最短路。
    • 时间复杂度为 \(O(Q sqrt_{N} + N^{1.5} \cdot \log_{N})\)
    • 这个代码感觉有点难写。经过一番激战还是写出来了。
  • CF232E Quick Tortoise
    • 按照上面的做法做少一个 \(\log\) 即为 \(O(Q sqrt_{N} + N^{1.5})\) (\(N\) 为平面图的大小即为矩阵点数)
    • 用 bitset 来进行优化
      • 具体地记录每个点用bitset记录它能到哪些中转点/哪些中转点能到达它
      • 查询把两个bitset与一下看有没有交即可
    • 故时间复杂度为 \(O(\frac{Q sqrt_{N} + N^{1.5}}{w} )\)
  • 题目:一个连通图,边-点=\(k\),\(k\) 很小,\(q\) 组查询求最短路
    • 对这个连通图求出一棵最小生成树,故还剩了 \(k+1\) 个条边,把这 \(k+1\) 条边的任一端点作为中转点,求出它们到其他所有点的最短路,对于查询 \((sx, ex)\) 要么 \(sx -> ex\) 走树上的边,要么经过中转点,即可
  • D Giant Penguin qoj837
    • 首先我们肯定是想用一个比较小的点集把图分成两部分,求出这个点集到最近黑点的距离,再求出这个点集到图上所有点的距离,来更新这图上所有点到黑点的距离,然后再分。
    • 考虑 一个点最多在 \(k\) 个简单环的条件,我们发现先随便用这个图的一棵树的重心来分,可以发现最多有 \(k\) 条横叉的边,(因为根节点最多在 \(k\) 个简单环中),故我们可以用这 \(k\) 条返祖边断开这颗树,用 \(2k+1\) (包括根节点) 来作为这个断开这张图的点集,按上述方法实现。
    • 考虑如何进行两个操作
      • 染色
        • 把这个节点所在的最多 \(\log_{N}\) 张图,更新短链到最近黑点的距离。 (一次操作的复杂度为 \(k \log_{N}\)
      • 查询
        • 把这个节点所在的最多 \(\log_{N}\) 张图,对图的短链上的所有点求取答案 (一次操作的复杂度为 \(k \log_{N}\))
    • 又因为预处理的时间复杂度为 \(N k \log_{N}\)
    • 所以总的时间复杂度为 \(O((N + Q) \cdot k \log_{N})\)
    • 类似点分树/点分治的思想!(每次选取重心为根节点)
  • 全局平衡二叉树

    • 没太理解dyh在说什么,没理解重链应该是按重链上的节点,还是要包含重链上挂的节点,加上这个感觉不太常用,也比较难学。算了先补别的知识吧
  • Day 7 cdq分治与分治杂题

    • B
      • 题意:给定一个数列 \(a\),求划分区间的方案,需要满足 \(i\) 所在的区间长度 \(len >= a_i\),对于每个 \(x = 1-n\) 求出把 \(a_x\) 改成 1 后的划分区间方案数
      • 先考虑没有修改操作我们应该怎么做
        • 采取 cdq分治
        • 对于 \([l,mid]\) 先处理,再计算 \([l,mid]\)\([mid+1,r]\) 的贡献,后处理 \([mid+1,r]\)
        • 考虑如何计算 \([l,mid]\)\([mid+1,r]\) 的贡献
        • 对于所有 \([l,mid]\)的,定义 \(L_i\)\(j \in [i,mid]\)\(a_j\) 的最大值
        • 对于所有 \([mid+1,r]\)的,定义 \(R_i\)\(j \in [mid+1,i]\)\(a_j\) 的最大值
        • 故若 \(i\) 能转移到 \(j\) 需要满足 \(j-i >= \max(L_i,R_j)\)\(L_i + i <= j\)\(i <= j - R_j\),对这个进行二维数点即可(对某一维排序后用树状数组维护另一维)。
        • 时间复杂度为 \(O(N \log_{N}^2)\)
      • 考虑修改
        • 定义 \(f_i\)\(1-i\) 的划分方案,\(g_i\)\(i-n\) 的划分方案(\(g_i\) 的求解可以倒过来求一遍cdq分治)
        • 考虑统计 \(i \in [l,r]\) \([l,r]\) 区间合法的 \(\sum_{[l,r]合法} f_{l-1} \cdot g_{r+1}\)
posted @ 2026-02-02 12:11  睡神本神  阅读(1)  评论(0)    收藏  举报