xtu寒假做题1月12日题解

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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值