oj 1263
提示:矩形的交,一维扩展,经典
我们很容易知道,两个矩形面积的并,就是两个矩形面积的和减去面积的交集。
所以子问题就是面积的交。这是一个经典问题。
矩形面积的交,一种通用的方法是扩展维度。
我们思考,对于两条线段的交集: ( l 1 , r 1 ) , ( l 2 , r 2 ) (l_1, r_1),(l_2, r_2) (l1,r1),(l2,r2) 他们的交集是什么,如果存在的话,那么一定是: ( m a x ( l 1 , l 2 ) , m i n ( r 1 , r 2 ) ) (max(l_1,l_2),min(r_1,r_2)) (max(l1,l2),min(r1,r2)) 。实际上,我们很容易将其扩展到二维,即矩阵。将横纵坐标分开考虑即可。看成两条线段的交集,如果均有交集,即可说明存在交集,且面积就算线段长度的乘积。
#include <stdio.h>
#define swap(x, y) {int t = x; x = y; y = t;}
#define min(x, y) (x < y ? x : y)
#define max(x, y) (x > y ? x : y)
int main() {
int a1, b1, a2, b2;
int c1, d1, c2, d2;
int tx1, tx2, ty1, ty2;
while (scanf("%d %d %d %d", &a1, &b1, &a2, &b2) == 4)
{
scanf("%d %d %d %d", &c1, &d1, &c2, &d2);
if (a1 > a2) swap(a1, a2); // 调整大小关系
if (b1 > b2) swap(b1, b2);
if (c1 > c2) swap(c1, c2);
if (d1 > d2) swap(d1, d2);
tx1 = max(a1, c1); // 取交集
ty1 = max(b1, d1);
tx2 = min(a2, c2);
ty2 = min(b2, d2);
int f = 0;
if (tx1 < tx2 && ty1 < ty2) // 存在交集
f = (tx2 - tx1) * (ty2 - ty1);
printf("%d\n", (a2 - a1) * (b2 - b1) + (c2 - c1) * (d2 - d1) - f);
}
return 0;
}