zoukankan      html  css  js  c++  java
  • 偏序问题学习笔记

    前提

    给若干个 (n) 维的点,对于每个点求出每一维均小于等于它的点的数量。

    按字典序排序,预处理相同的点,这样后面的点不可能对前面的点产生贡献。

    预处理相同的点在排序后。如果某个点后面有与其相同的点,那么当前点的贡献就会少算,所以我们需要提前在当前点的答案中加上后面与其相同的点的数量。

    经过这样一通操作后,问题就变成了求一个点前面的答案。

    二维偏序

    第一维单调不降,第二维用树状数组单点加一前缀求和维护。


    考虑 CDQ 分治。

    先将区间划分成两段,分别递归计算其内部的贡献,然后考虑前一段区间对后一段区间的贡献。

    一开始整个区间第一维一定是单调不降的,第二维则是乱序的。在递归完成后,我们令两段区间第二维均是单调不降的,第一维则是乱序的。

    因为递归之前并没有对区间进行任何修改,所以前一段区间第一维的最大值小于等于后一段区间第一维的最小值,于是我们忽略第一维。

    接着对两段区间分别维护一个指针,表示当前扫到哪里了。如果前一段区间指针指向的点的第二维小于等于后一段区间指针指向的点的第二维,则说明前者可以对后者及其后面的所有点产生 (1) 的贡献,记录下来并将前一段区间的指针后移一位;否则说明后者已经不能被贡献到了,统计答案然后将后一段区间的指针后移一位。

    每次将对应的点重新依次加入,那么整个区间第二维就是单调不降的了,符合递归返回时的要求。

    三维偏序

    仍然上 CDQ 分治,做到第二维时,先不统计贡献,而是将点打上标记:前一段区间的点标记为 (0),后一段区间的点标记为 (1)。在处理完后,我们再次 CDQ 分治。

    第二维在 CDQ 分治时同样有只能从前一段区间贡献到后一段区间的要求,所以只有标记为 (0) 的点才能贡献到后面标记为 (1) 的点,多判断这一点,按照相同的方法统计答案即可。

    多维偏序

    好,我们来总结一下。

    • 时刻保证前面的点对后面的点才有影响。
    • 刚刚忽略的这一维在上一次 CDQ 分治中变得单调不降。
    • 只能从前一段区间贡献到后一段区间,为当前 CDQ 分治打上限定顺序的标记。
    • 最终统计答案时,仅仅只有标记均为 (0) 的点能贡献到标记均为 (1) 的点。

    关于第二点,究其原因,其实是在合并的过程中采用的是在等于的情况下优先放前一段区间的点,不会破坏最初排序的目的

    不理解上面这句话相当于存在一个巨大的漏洞。

  • 相关阅读:
    Django REST framework的解析器与渲染器
    python基础之 数据格式化
    REST framework 之 分页
    Django REST framework 之 认证 权限 限制
    DjangoRestFrameWork 版本控制
    DjangoRESTFrameWork中的视图
    浏览器跨域问题
    初识REST
    vue之生命周期
    vue组件
  • 原文地址:https://www.cnblogs.com/May-2nd/p/15042120.html
Copyright © 2011-2022 走看看