https://www.acmicpc.net/problem/3321
n개의 행 각각에 대해 그 행을 밑변으로 하는 직사각형을 확인하면 된다.
각 행에서 각 위치에 대해 위로 연속한 1의 개수를 위 행에서의 값을 참조하여 O(m)만에 update할 수 있다.
대충 아래와 같은 그림을 생각해 보면 되겠다.
이 연속한 1의 개수를 내림차순으로 정렬하면, 그 행을 밑변으로 하는 직사각형 중 가장 큰걸 쉽게 확인할 수 있다. TC의 답을 나타낸 아래 그림과 같이, 내림차순인 히스토그램에서 가장 큰 직사각형을 구하는 것이기 때문이다.
그리고 연속한 개수가 1 증가하거나 0으로 바뀌거나 둘 중 하나기에, 0으로 바뀐건 뒤쪽으로 몰아 놓으면 1이 증가하는 부분은 위 행에서의 정렬 상태가 유지되어 O(m)만에 정렬까지 처리된다. O(mlogm)으로 정렬하면 터진다.
0.6초라서 상수가 크게 짜면 O(nm)짜리 풀이긴 하지만 TLE가 날 수 있음에 주의하자. 필자는 592ms로 통과했다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 14458 소가 길을 건너간 이유 10 (2) | 2023.02.01 |
---|---|
백준 6101 식당 (0) | 2023.01.31 |
백준 20189 사탕 돌리기 (0) | 2023.01.29 |
백준 5896 효율적으로 소 사기 (0) | 2023.01.28 |
백준 10265 MT (0) | 2023.01.26 |