加载中...

扫描线 以及看上去是扫描线的面积题

基础 求给出坐标轴的交集区间 求交集区间
c——————————d
a—————————————b
所以交集就是 max(min(b,d)-max(a,b), 0)
当然可能没有交集 所以要和0取max max( 0,max(min(b,d)-max(a,b), 0))

简易扫描线 求区间即可

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int get(int a, int b, int c, int d)
{
    return max(0, min(b, d) - max(a, c));//min(两个数值大的 一端端点)-max(两个数值小 一端端点 )
}

int area(int a[])
{
    return (a[2] - a[0]) * (a[3] - a[1]);//
}

int main()
{
    int a[3][4];
    for (int i = 0; i < 3; i ++ )
        for (int j = 0; j < 4; j ++ )
            cin >> a[i][j];

    int res = 0;
    for (int i = 0; i < 2; i ++ )
        res += get(a[i][0], a[i][2], a[2][0], a[2][2])
                * get(a[i][1], a[i][3], a[2][1], a[2][3]);

    cout << area(a[0]) + area(a[1]) - res << endl;
    return 0;
}


https://www.acwing.com/problem/content/1751/

一个矩形a被另一个矩形b已经覆盖 求把矩形a完全覆盖的矩形c的面积大小

x 和 y的数值小才-1000~1000多(更大的话就开不了矩阵了) 数据量少 不分类讨论 直接暴力矩阵模拟求点
因为可能有负数 所以加一个偏移量
————————————>y
|
|
|
|
↓ x

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 2010, B = N / 2;

bool st[N][N];

int main()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    a += B, b += B, c += B, d += B;
    for (int i = a; i < c; i ++ )/不能枚举到c 因为点比区间多一 所以这样刚刚好
        for (int j = b; j < d; j ++ )
            st[i][j] = true;//设为真表示 这个点有面积

    cin >> a >> b >> c >> d;
    a += B, b += B, c += B, d += B;
    for (int i = a; i < c; i ++ )
        for (int j = b; j < d; j ++ )//同理
            st[i][j] = false;

    a = b = N, c = d = 0;
    for (int i = 0; i < N; i ++ )
        for (int j = 0; j < N; j ++ )
            if (st[i][j])
            {
                a = min(a, i), c = max(c, i);//(a,b)为左上角的坐标 (c,d)为右下角的点的坐标
                b = min(b, j), d = max(d, j);
            }

    int w = max(0, c - a + 1), h = max(0, d - b + 1);
    cout << w * h << endl;
    return 0;
}



posted @ 2022-05-23 23:32  liang302  阅读(36)  评论(0编辑  收藏  举报