티스토리 뷰
https://www.acmicpc.net/problem/20193
20193번: 화려한 정사각형
평면에 N개의 점 P1(x1, y1), P2(x2, y2), . . . , PN(xN, yN)이 주어지며, 각각의 점들은 총 K개의 색깔 중 하나를 가지고 있다. 각 점의 색깔은 {1, 2, . . . , K} 중의 한 정수로 표현된다. 어떤 정사각형이 각 K
www.acmicpc.net
2 <= K <= N <= 100, 000 인 N개인 점들 중, K개의 색깔을 모두 포함하는 가장 작은 정사각형을 찾는 문제이다.K개의 색깔을 모두 포함하는 가장 작은 정사각형의 한변의 길이를 출력해주면 된다.
Parametric Search
한 변의 길이가 R인 정사각형으로 K개의 색깔을 모두 포함할 수 있는가? 라는 결정문제로 바꾸어, K개의 색깔을 모두 포함하는 R의 최소값을 찾는다.
sweeping

각 점의 x좌표마다 [y, y+R] 구간에 +1을 업데이트하고, 각 점의 'x좌표 + R + 1'마다 [y, y+R]구간에 -1을 업데이트하면, 임의의 어떤 지점을 보았을 때, 그 값이 K라면 길이가 R인 정사각형 안에 K개의 점이 포함된다고 판단할 수 있다.
- x축 정렬
- 각 점의 x축 좌표마다 Segment Tree + Lazy Propagation을 이용하여 [y, y+R] 구간에 +1을 업데이트 한다.
- 각 점의 x + R + 1좌표마다 [y, y+R] 구간에 -1을 업데이트 한다.
- 정렬된 x축 좌표 순서대로 +1, -1을 업데이트해가며, 업데이트된 segment tree에서 max값을 구한다.
- max값이 K(색깔의 개수)와 같으면 K개의 색깔이 한 변의 길이가 R인 정사각형안에 모두 포함된다고 판단할 수 있다.
[예시]
- [2,5] 구간에 +1 update, max값은 1.
- [5,8] 구간에 +1 update max값은 y가 5일 때 2.
- [2,5] 구간에 -1 update
- [5,8] 구간에 -1 update
중복 확인

sweeping을 하면서 구간 업데이트를 해준 후, max값을 구하는 segment tree query를 통해 max값이 K이면 한 변의 길이가 R인 정사각형안에 K개의 색깔이 모두 포함된다고 판단할 수 있다.
그런데, 위의 그림과 같이 [2,5]구간에 +1을 update, [5,8]구간에 +1을 업데이트를 해준다면, [5]지점은 동일한 색깔로 중복 업데이트되어 value 2를 가지게 되어 문제가 된다. 동일한 색깔이 중첩되는 구간의 경우, value 1만 가지게 하고 싶다.
이전에 +1을 update한 이력을 찾은 후, 중복되는 구간은 제외한 후 [6,8]에만 업데이트해주어야 한다.
- K개의 multiset을 이용.
- +1 update할 때 해당 색깔의 multiset에 y값을 insert.
- 차후, +1을 구간 update할 때, multiset을 이용하여 중복된 구간을 제외한 구간만 +1을 업데이트 해준다.
- -1을 구간 update할 경우도 마찬가지로 중복된 구간을 제외한 구간만 -1을 업데이트 해준다.
[예시]
- [2,5] 구간을 +1 update 할 때, multiset에 2를 insert.
- [5,8] 구간을 + 1update할 때, multiset에 5보다 작은 최대값을 찾음 (2)
- [2, 2 + R(3)] 구간은 +1 update시 제외되어야 하는 구간이므로, [6,8] 구간만 +1 update.
- [2,5] 구간을 -1 update할 때, multiset에 2보다 큰 최대값을 찾음 (5)
- [5, 5 + R(3)] 구간은 -1 update시 제외되어야 하는 구간이므로, [2,4] 구간만 -1 update.
- Parametric Search에 O( log(max좌표값) ), sweeping에 O(NlogN) 시간복잡도가 소요되어, 전체 시간복잡도는 O(N*logN*log(max좌표값) ).
참고 : https://justicehui.github.io/koi/2021/03/07/BOJ20193/
'Problem Solving' 카테고리의 다른 글
boj 16153 비트와 가희 (0) | 2022.09.16 |
---|---|
boj 11001: 김치 (0) | 2022.05.14 |
boj 1214 : 쿨한 물건 구매 (0) | 2021.06.11 |
boj 1126 : 같은 탑 (0) | 2021.06.07 |
boj 1017 : 소수 쌍 (0) | 2021.06.01 |
- Total
- Today
- Yesterday
- 백준 용액
- 백준 2467 용액
- codeground
- 백준 비숍
- boj 앱
- scpc
- 백준 앱
- 10159
- 알고리즘
- 백준 1806
- 풀이
- 백준알고리즘
- 연습문제
- boj 1806
- dp
- 백준
- boj 7579
- boj 용액
- 문제 풀이
- boj 1799
- 도시 분할 계획
- 백준 7579 앱
- BOJ
- SCPC 2016
- 백준 도시 분할 계획
- 백준 1647
- 2469
- 백준 부분합
- 네블컵 2회
- 백준 1799
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |