P4122 [USACO17DEC]Blocked Billboard B ——洛谷

在这里插入图片描述
在这里插入图片描述

几何分析法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int calculate_square(int x1, int y1, int x2, int y2);
int main()
{
    int x[7], y[7],s1, s2, minus_s1, minus_s2;
    scanf("%d %d %d %d", &x[1], &y[1], &x[2], &y[2]);
    scanf("%d %d %d %d", &x[3], &y[3], &x[4], &y[4]);
    scanf("%d %d %d %d", &x[5], &y[5], &x[6], &y[6]);
    s1 = calculate_square(x[1], y[1], x[2], y[2]);
    s2 = calculate_square(x[3], y[3], x[4], y[4]);
    if((max(x[5],x[1])<=min(x[6],x[2]))&&(max(y[5], y[1])<= min(y[6], y[2])))
    minus_s1 = calculate_square(max(x[5],x[1]),max(y[5], y[1]), min(x[6],x[2]), min(y[6], y[2]));//求矩形1 和3 相交的面积
    else minus_s1 = 0;
    if((max(x[5],x[3])<=min(x[6],x[4]))&&(max(y[5], y[3])<= min(y[6], y[4])))
    minus_s2 = calculate_square(max(x[5],x[3]),max(y[5], y[3]), min(x[6],x[4]), min(y[6], y[4]));//求矩形2和3 相交的面积
    else minus_s2 = 0;
    printf("%d\n", s1+s2-minus_s1-minus_s2);
    return 0;
}
int calculate_square(int x1, int y1, int x2, int y2)
{
    int x, y, s;
    x = abs(x1- x2);
    y = abs(y1- y2);
    s = x * y;
    return s;
}

差分矩阵

#include<iostream>
using namespace std;
const int N = 2010;
int a[N][N], b[N][N];
void insert(int x1, int y1, int x2, int y2, int c)
{
    b[x1][y1] += c;
    b[x2 + 1][y1] -= c;
    b[x1][y2 + 1] -= c;
    b[x2 + 1][y2 + 1] += c;
}
int main()
{
    int x1, y1, x2, y2, m = 3;
    while(m--)
    {
        cin >> x1 >>y1 >> x2 >> y2;
        x1 += 1001; y1 += 1001; x2 += 1001; y2 += 1001;//因为坐标范围[-1000, 1000], 加上1001, 保证坐标为正数
        if(m) insert(x1, y1, x2 - 1, y2 - 1, 1);
        else insert(x1, y1, x2 - 1, y2 - 1, -1);//当第三块时 -1, 可减去与1, 2 相交的部分
    }
     int sum = 0;
     for(int i = 1; i <= 2000; i ++)
       for(int j = 1; j <= 2000; j++)
       {
           a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];
           if(a[i][j] > 0) sum ++;
       }
       cout << sum << endl;
       return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值