zoukankan      html  css  js  c++  java
  • CDQ分治

    课件链接

    CDQ分治

    [BOI2007]MOKIA

    题意:一个2000000*2000000的棋盘,每个格子有一个数,维护两种操作:

    ADD x, y: a A[x, y] += a;

    QUERY x0, y0, x1, y1: 询问矩阵内的和。

    CDQ分治时按x维排序使用扫描线,y维使用树状数组。每个询问拆成两部分,(x0, y0, y1)与(x1, y0, y1)。

    扫描到x0时,贡献为负,ans -= sum(y0, y1), 扫描到x1时贡献为正,ans += sum(y0, y1)。

     

    [VIOLET3]天使玩偶

    维护二维点集。1.插入点(x, y),2.询问离(x, y)曼哈顿距离最近的点的距离。

    CDQ分治需要分类讨论。左下,左上,右下,右上部分点的最近点。以左下为例。即求左下中x+y的值最大的点。

    无1操作时,按x维排序,树状数组处理。

    有1操作时,CDQ分治时按x维排序,处理同无1操作。

     

    三维偏序统计问题。参见上一篇博文。

     

    四维偏序simle版判定。

    四维的点集。判断每个点是否存在一个点比它大。大的定义为四维中任意一维都比它大。

    考虑对任一点,是否存在某一点四维都比它小。

    按第一维排序后,有了时间限制。等价于任一点,排在前面的点是否存在其他三维都比它小。

    因为是判定性问题,我们可降一维,判断第二维与第三维比它小的点中第四维的最小值,改为非判定性问题。

    可用CDQ分治再降一维。

    CDQ分治时按第二维排序,第三维使用树状数组,求前缀最小值即可。

     

    四维偏序normal版统计

    四维的点集,求最长上升子序列,即求每个点比它小的点的个数。

    两次CDQ分治。不会。

     

    五维偏序统计

    四维的点集,求最长上升子序列,即求每个点比它小的点的个数。

    三次CDQ分治?多了两个log常数大,性能可能不及O(n^2)。

     

    [FJOI2012]长度为N的数组开始为空。每次执行操作Pi, Qi, 表示在Pi位上填上Qi,输出每次操作后的逆序对数。

    CDQ分治,合并统计时可离散化+树状数组搞一下即可。

     

    还有DP上的CDQ分治,没有学,道理类似。

     

    ===========================================================================================================

    总结:

    CDQ分治是基于时间分治。

    在线问题离线化。

    CDQ分治后可降维。

     

     

  • 相关阅读:
    在 Borland C++ 及 Visual C++ 环境中使用 STLport (作者:孟岩)
    设置JavaFX-CSS改变TreeView节点图标
    Using MS DataGrid control with ADO
    两个加载fxml文件的方法
    JavaFX中ObservableValue类型
    在 Eclipse 下利用 gradle 构建系统
    JavaFX初探
    深度剖析如何保证缓存与数据库的一致性
    ACID的实现原理
    一颗高度为3的B+树能存多少行数据?
  • 原文地址:https://www.cnblogs.com/dirge/p/5803635.html
Copyright © 2011-2022 走看看