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

     

     

  • 相关阅读:
    项目管理工程师和项目经理的差异
    技术洞察是技术战略成功的关键
    openpyxl使用总结
    Node.js基础入门第六天
    Node.js基础入门第五天
    正则表达式
    GitTagging
    Svelte3聊天室|svelte+svelteKit仿微信聊天实例|svelte.js开发App
    内存加压 | mempressure
    Android 新特性
  • 原文地址:https://www.cnblogs.com/dirge/p/5803635.html
Copyright © 2020-2023  润新知