BOJ 23507 Marbles

BOJ 23507 Marbles

문제 링크:

문제 내용

길이 LL의 트랙 위에 NN개의 구슬과 NN개의 스위치가 있습니다. 구슬과 스위치의 크기는 무시할 수 있습니다. 시각 0에 모든 구슬이 왼쪽이나 오른쪽 중 한 방향으로 구르기 시작합니다. 모든 구슬의 속력은 단위 시간 당 1 단위 길이이며, 구슬이 최초에 굴러갈 방향은 사전에 정할 수 있습니다.

두 구슬이 충돌하면 즉시 서로 반대 방향으로 같은 속력으로 움직입니다. 한 구슬이 트랙의 양 끝에 닿으면 반대 방향으로 움직이는데, 좌표 1에서 1로 돌아오는데, 그리고 좌표 LL에서 LL로 돌아오는데 각각 1 단위 시간이 걸립니다. 스위치는 구슬과 상호작용을 하지 않습니다.

각 구슬의 굴러갈 방향을 적절히 정해서 어떤 시점에 모든 스위치 위에 정확히 하나의 구슬이 오도록 하려고 합니다. 그것이 가능하다면 이를 달성하는 데 필요한 최소 시간을 구하세요.

입력

첫 줄에는 정수 LLNN이 주어집니다. (1L1091 \le L \le 10^9, 1N30001 \le N \le 3000)

두 번째 줄에는 구슬의 위치 A1,A2,,ANA_1, A_2, \cdots, A_N이 주어집니다. 이들은 모두 정수이며, 모두 서로 다릅니다.

세 번째 줄에는 스위치의 위치 B1,B2,,BNB_1, B_2, \cdots, B_N이 주어집니다. 이들은 모두 정수이며, 모두 서로 다릅니다.

출력

문제의 정답을 출력합니다. 그러한 방법이 존재하지 않을 경우 -1을 대신 출력합니다.

문제 풀이

스포일러

먼저, 구슬끼리의 충돌은 구슬끼리 서로 스쳐지나가는 것으로 바꿀 수 있습니다. 그러면 각 구슬의 이동은 주기 2L2L의 주기 운동을 하게 되며, 따라서 2L2L 미만의 시간만 고려하면 됩니다.

시간을 고정하였을 때, 각 구슬이 있을 수 있는 위치는 왼쪽으로 굴렸을 때와 오른쪽으로 굴렸을 때의 2가지입니다. 각 위치에 대해 스위치가 존재한다면 그 구슬 번호와 그 스위치 번호 사이에 간선을 그어 줄 수 있고, 완전 이분 매칭이 존재하는지 판별해주면 됩니다. 여러 가지 효율적인 방법이 있으나, Hopcroft-Karp 알고리즘을 그냥 박아도 그래프의 특수성에 의해 O(N)\mathcal{O}(N)에 판별되는 것으로 보입니다.

이제 A1A_1이 각 스위치 위에 올 수 있는 시각을 모두 구합니다. 2L2L 미만의 시간으로 하나의 스위치 위에 올 수 있는 방법은 정확히 4가지이며, 따라서 4N4N개의 시간에 대해 위의 테스트를 시도해보면 됩니다.

각 구슬이 어떤 시간에 있을 위치를 구할 때, 많조분으로 구하면 왜인지 모르게 틀릴 확률이 높습니다. 따라서 트랙 자체를 좌우로 반사시켜서 이어붙이고 그때 스위치의 위치들을 해시맵 등에 기록해 놓는 것이 좋습니다.

Last updated on