过度种植
过度种植
农夫约翰购买了一台新机器,该机器能够在其农场的任何“轴向对齐”(即具有垂直和水平边)的矩形区域内种草。
不幸的是,这台机器有一天出了故障,并在 $N$ 个不同的矩形区域内进行了种草工作,其中一些区域可能会有重叠。
给定机器工作的具体 $N$ 个矩形区域,请你计算种上草的区域的总面积是多少。
输入格式
第一行包含整数 $N$。
接下来 $N$ 行,每行包含四个整数 $x_{1},y_{1},x_{2},y_{2}$,表示其中一个矩形区域的左上角坐标 $\left( {x_{1},y_{1}} \right)$ 和右下角坐标 $\left( {x_{2},y_{2}} \right)$。
输出格式
输出种上草的区域的总面积。
数据范围
$1\ leq N \leq 10$,
$?10000 \leq x_{1},y_{1},x_{2},y_{2} \leq 10000$,
$x_{1} < x_{2}$,
$y_{1} > y_{2}$。
输入样例:
2 0 5 4 1 2 4 6 2
输出样例:
20
解题思路
如果$N$比较大的话,例如$N = 1000$,就需要用到扫描线。如果$N = 10000$还需要用到线段树来优化。但这里的$N$最大为$10$,并不需要用到那么复杂的写法。容易发现这些矩形的并集是一个不规则的图形,比较难求,但这些矩形的交集也是矩形,就比较好求了。因此我们发现并集不好求而交集好求,就可以用到容斥原理。容斥原理的公式如下:$$\left| \bigcup\limits_{1 \leq i \leq n} {S_{i}} \right| = \sum\limits_{1 \leq i \leq n} {\left| S_{i} \right|} - \sum\limits_{1 \leq {i 这样就可以把求并集的问题转换为求交集的问题。虽然交集好求,但项数很多,一共有$C_{n}^{1} + C_{n}^{2} + \dots + C_{n}^{n} = 2^{n} - 1$项,由于$N$最大只有$10$,因此最多也就只有$1023$项,再加上求所有矩形的交集,因此时间复杂度为$O \left( 2^{n} \times n \right)$。 矩形求交集其实就是区间求交,我们把$X$轴和$Y$轴独立开来看,例如$X$轴上有两个区间$\left[ {a,b} \right]$和$\left[ {c,d} \right]$,那么这两个区间的交集就是$\left[ {max \{{a,c}\},~ min \{{b,d}\}} \right]$。同理$Y$轴的区间求交也是如此。 我们在枚举每次求交集的矩形个数的时候(也就是枚举$C_{n}^{i}$),可以用二进制枚举。同时读入的坐标是数学坐标系,$y_{1} > y_{2}$,为了让$y_{1} < y_{2}$与$x_{1} < x_{2}$保持一致方便区间求交,我们把坐标系变成矩阵坐标系,即把左上角的点和右下角的点转化成左下角的点和右上角的点。 AC代码如下: AcWing 2032. 过度种植(春季每日一题2022):https://www.acwing.com/video/3878/ 1 #include
参考资料