BOJ 7962 A Journey to Mars

BOJ 7962 A Journey to Mars

문제 링크:

문제 내용

원형으로 이루어진 도로 위의 nn개의 지점에 주유소가 있습니다. 각 주유소의 위치와 그 주유소에서 차에 넣을 수 있는 연료의 양이 주어질 때, 각 주유소에서 시작하여 두 방향 중 한 방향으로 도로를 한 바퀴 돌아서 제자리로 돌아올 수 있는지 판별하세요.

맨 처음에 차의 연료통은 비어 있으며, 시작점에서 주유를 한 뒤 이동을 시작합니다. 1만큼의 연료가 있으면 1만큼의 거리를 이동할 수 있습니다. 차의 연료통에는 연료 제한이 없습니다.

입력

첫 줄에는 주유소의 개수 nn이 주어집니다. (3n1  000  0003 \le n \le 1\;000\;000)

다음 nn줄에 걸쳐서, ii번째 줄에는 먼저 ii번째 주유소에서 넣을 수 있는 연료의 양이 주어지고, 그 다음에 ii번째 주유소에서 i+1i+1번째 주유소까지의 거리가 주어집니다. (마지막 거리는 nn번째 주유소에서 첫 번째 주유소까지의 거리를 나타냅니다.) 연료의 양은 음이 아닌 정수, 거리는 양의 정수이며, 연료의 합과 거리의 합은 각각 2  000  000  0002\;000\;000\;000을 초과하지 않습니다.

출력

nn줄에 걸쳐서, ii번째 주유소에서 시작하여 한 바퀴를 돌 수 있으면 ii번째 줄에 TAK을, 아니라면 NIE를 출력합니다.

문제 풀이

스포일러

편의상 주유소에 0부터 n1n-1까지의 번호를 붙입니다. 먼저 0번 주유소에서 앞 방향으로 한 바퀴 돌 수 있는지 판별법을 생각합니다. ii번 주유소에서 주유한 뒤 i+1i+1번 주유소로 이동하는 것을 단위 이동이라고 할 때, nn번의 단위 이동 뒤의 연료의 양이 모두 0 이상이면 가능하고, 아니라면 불가능합니다.

이제 위에서 구한 ii번의 단위 이동 뒤의 연료의 양을 a0,a1,,ana_0, a_1, \cdots, a_n이라고 합시다. ii번 주유소에서 시작한다면, 이 배열에서 ai+1ana_{i+1} \cdots a_nii번 주유소에 도착했을 때 aia_i만큼의 연료가 있다고 가정하고 구해진 연료의 양이므로, 각각에서 aia_i를 뺀 것이 0 이상인지 판별해야 합니다. 또한, 0번 주유소를 지나서 ii번 주유소까지 돌아오는 과정에서의 연료의 양은 시작 때 aia_i만큼 있었다고 가정하면 aj+ana_j + a_n 만큼의 연료가 남게 되므로, 각각에서 anaia_n - a_i를 더한 것이 0 이상인지 판별하면 됩니다.

모든 구간 체크는 prefix min과 suffix min을 알면 총 선형에 구할 수 있습니다. 세그먼트 트리를 사용하기에는 제한 시간이 아슬아슬하니 주의합니다.

Last updated on