이 문제를 세그먼트 트리로 푼다면, 구간 최솟값을 로그 시간에 구하기 위해서입니다.
그러니 getMinIndex 같은 녀석이 필요하지 않도록 구현해야 의미가 있습니다.
지금 코드는 그냥 query에 getMinIndex 넣은 것 보다 느릴 것으로 예상됩니다. 당연히 그보다 더 빠른건 매번 min을 사용한 경우입니다. (물론 이 경우 TLE 입니다.)
세그먼트 트리 구현이 어렵다면 스택을 사용해서도 풀이가 가능하다는 점도 고려해보시면 좋을 것 같습니다.
세그먼트 트리로 푸신다면 getMinIndex가 0을 리턴하면 False 취급 된다는 점이 고려가 안되어있으나 세그먼트 트리가 잘 구현 된 경우 애초에 필요가 없었을 함수이므로 다시 짜실 때 고려하실 필요는 없을 것 같습니다.
bbbjihan 2년 전
각 노드가 [구간 내 최소값의 배열 내 인덱스, 구간의 시작인덱스, 구간의 끝인덱스]로 구성되어있는 세그먼트 트리를 구현하였습니다. 루트노드부터 시작하여 탑-다운 방식으로 구현하였는데, 노드의 첫번째 값인 최소값의 배열 내 인덱스를 기준으로 좌측 구간과 우측 구간을 해당 노드의 좌,우 자식노드에 각각 입력하여 리프노드까지 완성합니다.
쿼리문은 어차피 트리의 크기가 2**ceil(log2(최대배열의 길이)+1)보다 작을 것이기 때문에 아무리 커도 30만보다 작을 것으로 예상되어 트리의 원소에 for문을 돌려 모든 노드의 구간 내에서의 최대사각형의 넓이로 최댓값을 갱신하여 리턴하였습니다.
테스트케이스의 최대 크기가 제한되어 있지 않기 때문에 쿼리문의 시간복잡도를 좀 더 고려하여 구현하기 해야겠지만, 답을 제출하였을 경우 시간초과가 나기 이전에 '틀렸습니다.'가 출력됩니다.
게시판에 나와 있는 모든 반례가 통과됩니다.
로직 상에 어떤 문제가 있는지 아무리 찾아봐도 모르겠습니다. 도움 부탁드립니다.
+테스트케이스로 N=100000, 모든 사각형의 높이가 1000000000인, 모든 값이 최대인 테스트케이스 입력해보았으나 문제가 없었습니다.