Question1
给定若干个矩形,线矩形的面积并。分别用 O ( n 2 ) O(n^2) O(n2)级别和 O ( n l o g n ) O(n\ log\ n) O(n log n)级别的算法解决。
我们的做法是对矩形的纵坐标进行离散化,得到离散化后的坐标 y 1 , y 2 , . . . , y m . y_1,y_2,...,y_m. y1,y2,...,ym.用 v a l ( y ) val(y) val(y)表示原始坐标值。这样我们就可以将浮点数转化为了方便处理的整数,有利于数组下表的表示。
我们用数组 c [ i ] ( i ∈ [ 1 , m ) ) c[i](i∈[1,m)) c[i](i∈[1,m))存储在当前情况下, y i + 1 − y i y_{i+1}-y_{i} yi+1−yi的纵区间的覆盖情况。 0 0 0表示没有覆盖, k k k表示被覆盖了 k k k次,不可能出现小于 0 0 0的情况,因为只有“被覆盖的次数”和“没有覆盖”两种情况的存在。
现在我们回到这个面积计算的题中:我们可以将一个矩形的左右边界分别处理,左边界带来的是“正影响”,会对答案做出纵区间大小的贡献;右边界带来的是“负影响”,会使先前的正影响消失。这也是上面c数组都是非负数的原因。因此我们可以将左右边界分开,用四元组表示(横坐标,上边界,下边界,影响);用 ( x i , y 1 , i , y 2 , i , f i ) (x_i,y_{1,i},y_{2,i},f_i) (xi,y1,i,y2,i,fi)表示。这里的影响指“正影响”和“负影响”,分别规定为1和-1.
得到若干个四元组以后,我们需要对 x x x坐标进行排序,那么我们得到了一个 x x x坐标递增的“竖线”。枚举每一个四元组,若当前的影响为正,则令 c [ k ] ( k ∈ [ y 1 , i , y 2 , i ) ) c[k](k∈[y_{1,i},y_{2,i})) c[k](k∈