现有 $n$ 朵花,每朵花有三个属性 $a,b,c\leq k$ , 定义花朵 $i$ 比 花朵 $j$ 美丽当且仅当 $a_i\geq a_j,b_i\geq b_j,c_i\geq c_j$ , 一朵花比其它多少朵花美丽它的级别就是多高,统计出每个级别的花朵数量。
$n\leq10^5,k\leq2\times10^5$
这道题就是经典的三维偏序问题,后面比较复杂的题目也大多是要转化到三维偏序问题上来解决的。用时间分治算法解决这种问题的思路就是先按照 $a$ 排序,然后分治到一层按照 $b$ 归并排序,在排序的过程中以 $c$ 为关键字用树状数组统计答案。时间复杂度 $O(n\log_2^2n)$
1 | /************************************************************** |
[Balkan2007] Mokia
维护一个 $N\times N$ 的矩阵,初始值均为 $S$ . 每次操作可以增加某格子的权值,或询问某子矩阵的总权值。其中,有 $M$ 次修改, $Q$ 次询问
$N\leq2\times10^6,M\leq16\times10^4,Q\leq10^4$
其实上一道题并没有包含时间分治算法的精髓,其最终要的思想其实是每次分治到一个区间 $[l,r]$ 时,将区间划分为 $[l,mid],[mid+1,r]$ 两部分, 对两部分分别按照第二关键字排序,然后考虑左区间中的修改对右区间中的询问的影响。
按照套路,二维子矩阵求和可以利用前缀和快速求出:若 $S(x_1,y_1,x_2,y_2)$ 表示左上角坐标为 $(x_1,y_1)$ , 右下角坐标为 $(x_2,y_2)$ 的子矩阵面积,那么
$$
S(x1,y1,x2,y2)=S(1,1,x2,y2)-S(1,1,x1-1,y2)-S(1,1,x2,y1-1)+S(1,1,x1-1,y1-1)
$$
而求 $S(1,1,x,y)$ 其实就是统计在询问之前且在 $(x,y)$ 左上方的增加权值加上 $xyS$ 的初始权值。这样问题就变成了一个,时间、二维空间的三维偏序问题。
1 | /************************************************************** |
同样套路的题目:
$n$ 次询问动态平面最近点的曼哈顿距离
$n\leq2\times10^6$
注意到如果只是求左上角的最近点的曼哈顿距离就可以转化成三维偏序问题了,只不过树状数组变成维护最大值而已,而对于原问题在四个方向跑四次分治即可。
1 | /************************************************************** |
[CQOI2011] 动态逆序对
给定一个 $n$ 个元素的排列,依次删除其中的 $m$ 个元素,求每次删除后的逆序对个数。
$n\leq10^6,m\leq5\times10^5$
正难则反,将原题中的”初始有 $n$ 个元素,依次删除 $m$ 个”改为:“初始有 $n-m$ 个元素,依次加入 $m$ 个”。
之后其实就是一个三维偏序问题了,但不同于一般的三维偏序,本题有两种情况:
- 在新加入元素的左边且比新加入元素大的
- 在新加入元素的右边且比新加入元素小的
然而我们只能统计出在左边且小的个数,于是我们转换一下统计两次求和即可。
1 | /************************************************************** |
有 $n$ 个纸箱,一个纸箱能堆叠在另一纸箱上面当且仅当它的最短边、次短边和最长边长度分别严格小于另一个纸箱的最短边、次短边和最长边长度,从中选择一些纸箱堆叠在一起所能达到的最大纸箱个数n\leq。
$n\leq5\times10^4$
本题就是个裸的三维偏序最长上升子序列。
不过本题还是比较有意义的,因为不同于前面的题目可以直接用时间分治解决,本题分治后还需要进行动态规划,这也就意味着我们之前边归并排序边统计答案的做法不可行了,事实上,前面几道题都是特殊的情况,分治完左右两个区间后再统计答案,而像本题一样的特殊情况下就需要按照先分治左区间、统计答案再分治右区间的一般做法了。
1 | /************************************************************** |
[BZOJ2961] 共点圆
在平面直角坐标系中,有 $n$ 个操作:
- 加入一个以 $(x,y)$ 为圆心且的圆。
- 询问点 $(x,y)$ 是否在所有已加入的圆内部(包括边界)且存在已加入的圆。
$n\leq5\times10^5$
其实这道题作为一道分治的题目来说没有什么特殊的地方,放在这里是为了