아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

구슬 발사기

시간 제한1초메모리 제한1024 MB

요약
발사기마다 45도 회전 비용이 주어질 때, 발사기 s에서 발사한 구슬이 발사기 e에 도달하도록 회전 비용의 합을 최소로 만드는 경로를 구한다.
난이도

어려움10점 중 8점

유형
그래프, 최단 경로, 해시맵, 구현
정답자
아직 제출이 없습니다

문제

좌표 평면 위에 NN개의 구슬 발사기가 있다. 발사기에서 발사된 구슬은 발사기를 만나기 전까지 무한히 이동한다. 구슬이 이동 중에 발사기를 만나면 발사기가 바라보는 방향으로 다시 발사되며, 발사기를 방문하지 않고 지나칠 수는 없다. 구슬 발사기는 북, 북동, 동, 남동, 남, 남서, 서, 북서 이렇게 88가지 방향을 바라볼 수 있다. 또한 발사기의 방향을 시계방향으로 원하는 만큼 회전시킬 수 있는데, 발사기 ii를 4545도 회전하기 위해 필요한 비용은 cic_{i}이다. 발사기는 최대 한 번 구슬을 발사할 수 있다. 따라서 한 번 사용된 발사기에 구슬이 방문한다면 더 이상 구슬이 이동하지 않고 그 발사기에 멈춘다.

발사기의 방향을 적절히 회전하여, 구슬을 발사기 ss에서 발사기 ee까지 최소 비용으로 도달하게 하려고 한다. 이 때 최소 비용과 어느 발사기를 거쳐서 이동했는지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 정수 NN, ss, ee 이 주어진다. (2≤N≤100 000,1≤s,e≤N,s≠e2 \leq N \leq 100\,000, 1 \leq s, e \leq N, s \ne e)

다음 NN개의 줄에 걸쳐 발사기 ii의 정보 xix_{i}, yiy_{i}, cic_{i}, did_{i}가 공백으로 분리되어 주어진다.

  • xix_{i}와 yiy_{i}는 각각 발사기 ii의 xx좌표와 yy좌표이다. (1≤xi,yi≤1091 \leq x_i, y_i \leq 10^{9})
  • cic_{i}는 발사기 ii를 회전하는데 필요한 비용이다. (0≤ci≤200 0000 \leq c_i \leq 200\,000)
  • did_{i}는 발사기 ii가 초기에 바라보고 있는 방향이다. 알파벳 대문자 N, NE, E, SE, S, SW, W, NW중 하나이며 각각 북, 북동, 동, 남동, 남, 남서, 서, 북서 방향을 의미한다.

서로 다른 두 발사기가 같은 좌표에 존재하지 않으며, 모든 ii에 대하여 xix_i, yiy_i, cic_i는 정수이다.

출력

첫 번째 줄에 최소 비용을 출력한다.

두 번째 줄에 발사기 ss와 발사기 ee를 포함하여, 이동한 발사기의 번호를 출력한다. 만약 최소 비용으로 이동할 수 있는 경로가 여러 가지라면 아무거나 출력한다.

만약 발사기 ee까지 도달하는 것이 불가능하면, 첫 번째 줄에 −1-1을 출력한 뒤 종료한다.

힌트

동쪽이 xx좌표가 증가하는 방향, 북쪽이 yy좌표가 증가하는 방향이다.

예제2

  1. 예제 1

    입력
    4 1 4
    1 5 1 E
    5 5 2 SE
    5 1 4 W
    1 1 3 N
    
    예상 출력
    1
    1 3 4
    
  2. 예제 2

    입력
    4 1 4
    1 4 4 S
    4 5 2 SW
    5 2 1 N
    2 1 3 W
    
    예상 출력
    -1