직사각형 합집합 면적 구하기
기본적으로 각 직사각형의 꼭짓점이 되는 점을 x좌표 기준으로 스위핑하면서 각 점 사이의 사각형 넓이를 구하는 식으로 답을 구한다. 위 그림과 같이 두 직사각형이 주어지면, 노랑, 빨강, 파랑에 해당하는 사각형의 넓이를 각각 구한 후 더하는 것이다. 이를 위해서
- 우선 각 직사각형의 x 시작 좌표, x 끝 좌표와 y 시작 및 끝을 저장해놓는다. 그리고 x를 기준으로 정렬한다.
- cnt라는 이름의 세그먼트 트리에 y 범위에 대해 x 시작 좌표에서 +1, x 끝 좌표에서 -1을 해준다.
- cnt가 1 이상이면 (직사각형이 있는 구간이면) tree라는 이름의 세그먼트 트리에 직사각형이 있는 y 구간의 총 높이를 저장한다.
- 각 점 사이의 x 너비와 y 구간의 총 높이(
tree[1]
)를 곱해서 각 점 사이의 사각형 넓이를 구한다.
이 문제는 위 문제보다 좌표의 범위가 넓기 떄문에(0~10^9), 좌표를 기준으로 트리를 생성하면 메모리가 초과된다.
따라서 y의 인덱스를 기준으로 트리를 만들어 계산하면 된다. (좌표 압축)
직사각형 합집합 둘레 구하기
직사각형 합집합의 둘레를 구하는 문제도 비슷한 방식의 스위핑으로 해결할 수 있다.
y 구간의 총 높이를 저장하는 것은 똑같은데, 총 높이가 이전에 비해 변한만큼 둘레로 더해주면 된다.
x,y 둘레를 더해야하기 때문에 x에서 y1, y2까지, y에서 x1, x2까지를 각각 탐색하면서 값에 더해준다.