CDQ 分治

概述

  • CDQ 的本质好像是付 \(\log\) 解一维限制,付几个解几个,但是只能在一维上保序...

  • 大概就是,不断地把有序的维移动。譬如三维偏序的 cdq 套 cdq,首先让第一维有序,然后把序转到第二维上,此时第一维会失序所以要预先标记每个点在第一维上在左/右,然后把序转到第三维上,在转序的过程中(可以认为是“界面”)把答案统计咯(因为转序的过程中一维有左右序,一维保序,再多的维得靠之前记录的,因为它们早就失序了)。

例题

P3157 [CQOI2011] 动态逆序对

  • 题意略。

  • 一开始想了半天,老半天的前后缀主席树做法(分别对前后缀开桶,模仿树状数组求逆序对,算贡献),最后还是发现似乎没办法统计算重的贡献,因为得维护被删掉的点中有多少个下标小且值大或下标大且值小,而且这玩意等效在线。

  • 故还是来考虑一下 CDQ...我们称一个逆序对 \((i,j)\)“属于 \(i\)”,当且仅当 \(t_i<t_j\),这里 \(t_x\) 是第 \(x\) 个元素被删除的时间。对于未被删除的元素,认为 \(t_x=+\infty\)

  • 于是问题变成求初始序列的逆序对数量和属于每个 \(i\) 的逆序对数量。那么看到这里的属于其实就是 \(([i<j] \oplus [a_i<a_j]) \And t_i<t_j\) 这一三维偏序问题,显然可 CDQ。

  • 首先可以认为是按下标排序,然后套归并的壳子,每次合并的时候维护一下归属就好,实际实现中我的做法是用树状数组当桶储存对面的删除时刻。

  • 复杂度 \(O(n\log^2)\),一只 \(\log\) 是归并,一只是树状数组,常数稍大。

23.2.14 T4 鲍勃打比赛

  • 题意:给出序列 \(a_{1\sim n}\),记 \(S\) 为其所有不降子序列的集合,求 \(\max_{s\in S} f(s)\)\(f(s)\) 不太好数学语言化,用自然语言来说是各项权值和+每个未选段的价值,一个长为 \(k\) 的未选段的第 \(j\) 项的价值为 \(-j\)

  • 数据范围:\(n\leqslant 10^5,a\in [-10^9,10^9]\)

  • 本题也见李超线段树。

  • 有什么好说的?设计 dp 如下:

    • 状态设计:\(f_i\) 表示以 \(i\) 结尾的 LIS 的最大权。

    • 初始化:\(f_0=0\)

    • 状态转移:

    \[\begin{aligned} f_i & =\max_{j<i \land a_j\leqslant a_i}(f_j-\frac{(i-j)(i-j-1)}{2}+a_i) \\ & =\max_{j<i \land a_j\leqslant a_i}(f_j-\frac{i^2+j^2-2ij-i+j}{2})+a_i \\ & =\max_{j<i \land a_j\leqslant a_i}(ji+f_j-\frac{j^2+j}{2})-\frac{i^2-i}{2}+a_i \end{aligned} \]

  • 哟哟哟,这不是典型的斜优式子吗?哦有 \(a\) 的限制啊。没事,看我 CDQ 来薄纱李超树,按 \(a\) 排序后对 \(i\) CDQ 分治即把 \(a\) 的序转到 \(i\) 上,在界面上做斜优 dp,刚好现在序在 \(i\) 上。\(O(n\log n)\)

  • 哦有一点小问题,这里和一般的归并 CDQ 的实现有差异。一般的归并 CDQ 是后序遍历,但这里我们需要中序遍历,左向右的转移要早于右边内部的转移。这就破坏了归并结构,使得我们必须暴力 sort 右区间,相当于有一半的区间会被 sort,复杂度是 \(O(n\log^2)\) 的。

  • 但也不是不能严格单 \(\log\)。我们对每个区间维护一个 \(i\) 有序的拷贝,在区间分裂的时候也将拷贝分裂下去,归并时也把拷贝归并回来。此时不再需要 sort 右区间,故复杂度为严格 \(O(n\log n)\)

posted @ 2023-01-15 10:09  未欣  阅读(21)  评论(0编辑  收藏  举报