分治

CDQ分治

先分后治,先统计各区间的贡献,再统计前区间对后区间(后对前)的贡献

例题:逆序对$\ \ \ \ \ \ \ \ $ 平面最近点对

[P3810]【模板】三维偏序(陌上花开)

有 $ n $ 个元素,第 $ i $ 个元素有 $ a_i,b_i,c_i $ 三个属性,设 $ f(i) $ 表示满足 $ a_j \leq a_i $ 且 $ b_j \leq b_i $ 且 $ c_j \leq c_i $ 且 $ j \ne i $ 的 \(j\) 的数量。

对于 $ d \in [0, n) $,求 $ f(i) = d $ 的数量。

$ 1 \leq n \leq 10^5$,$1 \leq a_i, b_i, c_i \le k \leq 2 \times 10^5 $。

由二维偏序延伸

CDQ分治,树状数组都可以解决二维偏序问题,见逆序对

因此把两种做法套在一起就能做三维偏序了。

第一维排序,第二维分治,第三维树状数组。

细节

分治时千万不要整个树状数组都清零(清\([l,r]\)即可),不然复杂度会退化到\(O(n^2)\)

对于其他分治也一样,不要出现对\([1,n]\)的整体操作。

7586 -- 【6.11测试】AI高考数学134分

题意:给定序列\(A_i,B_i,C_i\),区间\([l,r]\)的权值为三序列在\([l,r]\)上的极差的积,求所有权值的和

重要思路:\(\{A_i\}\)的最小值为\(\{-A_i\}\)的最大值

拆乘积,问题转化为求三序列的最大值的积,cdq分治即可

细节

\([l,r]\)的前缀和数组记得把\(s[l-1]\)初始化,有可能访问到

用指针传数组可以避免栈过大,还方便处理

起变量名不要这样取,调试会很痛苦

posted @ 2024-10-31 17:03  Zhone_lb  阅读(10)  评论(0)    收藏  举报