BOJ 7962 A Journey to Mars
문제 내용
원형으로 이루어진 도로 위의 개의 지점에 주유소가 있습니다. 각 주유소의 위치와 그 주유소에서 차에 넣을 수 있는 연료의 양이 주어질 때, 각 주유소에서 시작하여 두 방향 중 한 방향으로 도로를 한 바퀴 돌아서 제자리로 돌아올 수 있는지 판별하세요.
맨 처음에 차의 연료통은 비어 있으며, 시작점에서 주유를 한 뒤 이동을 시작합니다. 1만큼의 연료가 있으면 1만큼의 거리를 이동할 수 있습니다. 차의 연료통에는 연료 제한이 없습니다.
입력
첫 줄에는 주유소의 개수 이 주어집니다. ()
다음 줄에 걸쳐서, 번째 줄에는 먼저 번째 주유소에서 넣을 수 있는 연료의 양이 주어지고, 그 다음에 번째 주유소에서 번째 주유소까지의 거리가 주어집니다. (마지막 거리는 번째 주유소에서 첫 번째 주유소까지의 거리를 나타냅니다.) 연료의 양은 음이 아닌 정수, 거리는 양의 정수이며, 연료의 합과 거리의 합은 각각 을 초과하지 않습니다.
출력
줄에 걸쳐서, 번째 주유소에서 시작하여 한 바퀴를 돌 수 있으면 번째 줄에 TAK을, 아니라면 NIE를 출력합니다.
문제 풀이
스포일러
편의상 주유소에 0부터 까지의 번호를 붙입니다. 먼저 0번 주유소에서 앞 방향으로 한 바퀴 돌 수 있는지 판별법을 생각합니다. 번 주유소에서 주유한 뒤 번 주유소로 이동하는 것을 단위 이동이라고 할 때, 번의 단위 이동 뒤의 연료의 양이 모두 0 이상이면 가능하고, 아니라면 불가능합니다.
이제 위에서 구한 번의 단위 이동 뒤의 연료의 양을 이라고 합시다. 번 주유소에서 시작한다면, 이 배열에서 은 번 주유소에 도착했을 때 만큼의 연료가 있다고 가정하고 구해진 연료의 양이므로, 각각에서 를 뺀 것이 0 이상인지 판별해야 합니다. 또한, 0번 주유소를 지나서 번 주유소까지 돌아오는 과정에서의 연료의 양은 시작 때 만큼 있었다고 가정하면 만큼의 연료가 남게 되므로, 각각에서 를 더한 것이 0 이상인지 판별하면 됩니다.
모든 구간 체크는 prefix min과 suffix min을 알면 총 선형에 구할 수 있습니다. 세그먼트 트리를 사용하기에는 제한 시간이 아슬아슬하니 주의합니다.