分治
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]\)初始化,有可能访问到
用指针传数组可以避免栈过大,还方便处理
起变量名不要这样取,调试会很痛苦

浙公网安备 33010602011771号