whquddn55   6년 전



1. 다익스트라로 a, b, c에서의 모든 정점까지의 최소거리 저장

2. a에서의 최소거리를 기준으로 정렬

3. 정렬된 정점을 순서대로 돌며 segment tree에 갱신하는 작업을 수행 

segment tree의 index는 b까지의 거리를, 원소는 c까지의 거리의 최소 값을 저장. 즉, 각 정점을 돌 때마다 tree[b까지의 거리]에 (c까지의 거리)를 갱신 해주고, tree[0, b까지의 거리 - 1]의 최소값과 (c까지의 거리)를 비교하여 최솟값이 더 작으면 false로, 아니면 true로 하여 저장 -> 출력


런타임에러가 뜨는것으로 보아 (b까지의 거리)의 최대값을 n으로 넘겨 tree의 크기를 사이징해주다보니 INT_MAX만큼 사이징되면 약 2기가바이트... 먹더라구요. 그래서 여러가지 테스트 많이 해봤는데
1. INT_MAX만큼 사이징하면 런타임에러가 아니라 메모리초과로 뜨는데 그럼...
2. 정올에 넣으니 런타임에러뜰 뿐만 아니라 틀린 TC도 여러개 보입니다. 대충 보니 YES로 나와야할 값들은 YES로 잘 나오는데 NO로 나와야하는 값들은 몇몇개가 YES로 나옵니다. 즉, true로 체크됩니다.

이 문제도 정확히 동일한 알고리즘으로 풀었는데 이 문제랑 다르게 중복되는 값이 있어서 그런가 통과를 못 하네요..  아래는 굉장한 학생 풀면서 메모한거 긁어온겁니다.
  1. 첫번째 등수를 기준으로 정렬
  2. 세그먼트트리 구성 ((0 ~ 두번째등수 - 1)사이의 c의 최소값을 구성하는)
  3. 최소값이 있다? -> 두번째 등수가 높은(숫자가 낮은) 학생이 있다.
  4. 최소값이 세번째 등수보다 작다? -> 세번째 등수가 높은(숫자가 낮은) 학생이 있다.
  5. 첫번째 등수는 정렬했으므로 숫자가 낮은 학생이 항상있으므로 세 숫자가 모든 낮은 학생이 존재하게되며 게임 끝났따
뭐가 문제일까요?

jh05013   6년 전

수의 범위가 너무 크지만 정확한 값이 아닌 대소관계만 비교하면 될 경우, 대소관계만 유지되도록 수를 1 이상 N 이하로 압축하는 방법이 주로 쓰입니다.

whquddn55   6년 전

@jh05013

도움받아서 조금 다른 방법으로 트리 구성해서 해결하긴했는데.. 압축하는 방법은 map써서 압축하는 그 방법 말씀하시는 건가요?

jh05013   6년 전

저는 C++을 쓰지 않기 때문에 실제로 무엇을 사용하는지는 모르겠지만 아마 맞는 것 같습니다.

댓글을 작성하려면 로그인해야 합니다.