https://www.acmicpc.net/problem/3321

 

3321번: 가장 큰 직사각형

열의 순서를 적절히 바꿔, 2열, 4열, 5열이 서로 붙어있게 놓는다면, 크기가 21인 직사각형을 얻을 수 있다. (2행~8행 * 2,4,5열)

www.acmicpc.net

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

+ Recent posts