扫描线 以及看上去是扫描线的面积题
基础 求给出坐标轴的交集区间 求交集区间
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;
}