【离散化】图形面积

L i n k Link Link

SSL 2880

D e s c r i p t i o n Description Description

桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

I n p u t Input Input

输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为– 1 0 8 10^8 108 1 0 8 10 ^ 8 108之间的整数。

O u t p u t Output Output

输出只有一行,一个整数,表示图形的面积。

S a m p l e Sample Sample I n p u t Input Input

3
1 1 4 3
2 -1 3 2
4 0 5 2

S a m p l e Sample Sample O u t p u t Output Output

10

T r a i n Train Train o f of of T h o u g h t Thought Thought

看到数据范围,只有一百个矩形,但是矩形的坐标却又2*1e8之大,所以我们要进行离散化,然后计算面积的时候将压去的坐标乘回去就好了

C o d e Code Code

#include
#include
#include
using namespace std;
int N, k, K; long long ans;
long long x[1001], y[1001], x1[101], y1[101], x2[101], y2[101];
int main()
{
	scanf("%d", &N);
	for (int i = 1; i <= N; ++i) {
		 scanf("%lld%lld%lld%lld", &x1[i], &y1[i], &x2[i], &y2[i]);
		 x[++k] = x1[i]; y[++K] = y1[i]; 
		 x[++k] = x2[i]; y[++K] = y2[i];
	 }
	sort(x + 1, x + k + 1);
	 int t = unique (x + 1, x + k + 1) - x;
	sort(y + 1, y + K + 1);
	 int T = unique (y + 1, y + K + 1) - y;
	 --t,--T;//   ↑↑↑离散化
	for (int i = 1; i <= t; ++i)
	 for (int j = 1; j <= T; ++j)
	  for (int k = 1; k <= N; ++k) { 
	        if (((x[i] > x1[k]) && (x[i] <= x2[k])) && ((y[j] > y1[k]) && (y[j] <= y2[k])))
	        {
	        	ans += (x[i] - x[i - 1]) * (y[j] - y[j - 1]);//计算矩形面积
	        	break;
	        } 
	}
	printf("%lld", ans); 
}

你可能感兴趣的:(离散化)