직각 사슬 풀기

시간 제한0.5초메모리 제한512 MB

요약
각 변의 회전 방향이 주어질 때, 진행 방향으로 현재 경계 상자를 1만큼 넓히는 규칙으로 사슬을 다시 만들고 각 변의 길이를 출력한다.
난이도

보통10점 중 4점

유형
시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

직각 사슬(rectilinear chain)은 수평 선분과 수직 선분이 번갈아 이어지는 순서열이다. 첫 선분은 원점 (0,0)(0,0)에서 시작해 오른쪽으로 향한다. 선분이 nn개인 직각 사슬은 nn개의 순서쌍 (lk,tk)(l_k, t_k)로 기술한다. lkl_k는 kk번째 선분 eke_k의 길이이고, tkt_k는 eke_k에서 ek+1e_{k+1}로 꺾는 방향이다. 1≤k<n1 \le k < n에서 왼쪽으로 꺾으면 tk=1t_k = 1, 오른쪽으로 꺾으면 tk=−1t_k = -1이다. k=nk = n일 때는 ene_n이 마지막 선분임을 뜻하도록 tn=0t_n = 0으로 둔다. 예를 들어 그림 (a)의 사슬은 (4, 1), (5, -1), (2, -1), (2, -1), (4, 1), (5, 0)으로 기술된다.

그림. (a) 단순하지 않은 사슬. (b) 풀어낸 단순 사슬.

사슬이 단순하다는 것은 이웃한 두 선분이 공유하는 끝점을 빼면 어떤 두 선분도 점을 공유하지 않는다는 뜻이다. 그림 (a)의 사슬은 단순하지 않다. 꺾는 방향을 모두 그대로 두고 각 선분의 길이만 바꾸면 사슬을 풀어 단순하게 만들 수 있다. 풀어낸 사슬에서 각 선분의 길이는 11 이상 nn 이하여야 한다. 그림 (b)는 (a)를 풀어낸 한 가지 결과이고, (4, 1), (5, -1), (2, -1), (2, -1), (1, 1), (2, 0)으로 기술된다.

푸는 방법은 보통 여러 가지다. 답을 하나로 정하려고 출력에서 설명하는 규칙으로 만든 사슬만 정답으로 인정한다.

입력

첫 줄에 사슬의 선분 개수 nn (1≤n≤100001 \le n \le 10000)이 주어진다. 이어지는 nn개 줄 중 kk번째 줄에는 eke_k의 길이 lkl_k (1≤lk≤100001 \le l_k \le 10000)와 꺾는 방향 tkt_k가 공백 하나를 사이에 두고 주어진다. 1≤k<n1 \le k < n에서 tkt_k는 왼쪽으로 꺾으면 11, 오른쪽으로 꺾으면 −1-1이고, tn=0t_n = 0이다.

출력

아래 규칙으로 만든 사슬의 선분 길이 nn개를 입력 순서대로 한 줄에 공백 하나로 구분해 출력한다. 꺾는 방향은 입력과 같으므로 출력하지 않는다.

원점 (0,0)(0,0)에서 시작하고, 처음에 방문한 점은 원점뿐이다. k=1k = 1부터 nn까지 차례로 eke_k의 끝점을 다음과 같이 정한다. 여기서 방문한 점은 원점과 e1e_1부터 ek−1e_{k-1}까지의 끝점을 말한다.

  • eke_k가 오른쪽으로 가면 끝점의 x좌표는 방문한 점의 x좌표 중 최댓값보다 11 크다.
  • eke_k가 왼쪽으로 가면 끝점의 x좌표는 방문한 점의 x좌표 중 최솟값보다 11 작다.
  • eke_k가 위로 가면 끝점의 y좌표는 방문한 점의 y좌표 중 최댓값보다 11 크다.
  • eke_k가 아래로 가면 끝점의 y좌표는 방문한 점의 y좌표 중 최솟값보다 11 작다.

eke_k의 길이는 시작점과 끝점 사이의 거리다. 이렇게 만든 사슬은 항상 단순하고 모든 길이가 11 이상 nn 이하다. 입력으로 주어지는 길이 lkl_k는 이 규칙에 쓰이지 않는다.

예제2

  1. 예제 1

    입력
    6
    4 1
    5 -1
    2 -1
    2 -1
    4 1
    5 0
    
    예상 출력
    1 1 1 2 3 1
    
  2. 예제 2

    입력
    6
    3 1
    3 1
    2 1
    4 1
    1 1
    3 0
    
    예상 출력
    1 1 2 2 3 3