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分治后可降维。

     

     

  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/dirge/p/5803635.html
Copyright © 2011-2022 走看看