BOJ 23507 Marbles
문제 내용
길이 의 트랙 위에 개의 구슬과 개의 스위치가 있습니다. 구슬과 스위치의 크기는 무시할 수 있습니다. 시각 0에 모든 구슬이 왼쪽이나 오른쪽 중 한 방향으로 구르기 시작합니다. 모든 구슬의 속력은 단위 시간 당 1 단위 길이이며, 구슬이 최초에 굴러갈 방향은 사전에 정할 수 있습니다.
두 구슬이 충돌하면 즉시 서로 반대 방향으로 같은 속력으로 움직입니다. 한 구슬이 트랙의 양 끝에 닿으면 반대 방향으로 움직이는데, 좌표 1에서 1로 돌아오는데, 그리고 좌표 에서 로 돌아오는데 각각 1 단위 시간이 걸립니다. 스위치는 구슬과 상호작용을 하지 않습니다.
각 구슬의 굴러갈 방향을 적절히 정해서 어떤 시점에 모든 스위치 위에 정확히 하나의 구슬이 오도록 하려고 합니다. 그것이 가능하다면 이를 달성하는 데 필요한 최소 시간을 구하세요.
입력
첫 줄에는 정수 과 이 주어집니다. (, )
두 번째 줄에는 구슬의 위치 이 주어집니다. 이들은 모두 정수이며, 모두 서로 다릅니다.
세 번째 줄에는 스위치의 위치 이 주어집니다. 이들은 모두 정수이며, 모두 서로 다릅니다.
출력
문제의 정답을 출력합니다. 그러한 방법이 존재하지 않을 경우 -1을 대신 출력합니다.
문제 풀이
스포일러
먼저, 구슬끼리의 충돌은 구슬끼리 서로 스쳐지나가는 것으로 바꿀 수 있습니다. 그러면 각 구슬의 이동은 주기 의 주기 운동을 하게 되며, 따라서 미만의 시간만 고려하면 됩니다.
시간을 고정하였을 때, 각 구슬이 있을 수 있는 위치는 왼쪽으로 굴렸을 때와 오른쪽으로 굴렸을 때의 2가지입니다. 각 위치에 대해 스위치가 존재한다면 그 구슬 번호와 그 스위치 번호 사이에 간선을 그어 줄 수 있고, 완전 이분 매칭이 존재하는지 판별해주면 됩니다. 여러 가지 효율적인 방법이 있으나, Hopcroft-Karp 알고리즘을 그냥 박아도 그래프의 특수성에 의해 에 판별되는 것으로 보입니다.
이제 이 각 스위치 위에 올 수 있는 시각을 모두 구합니다. 미만의 시간으로 하나의 스위치 위에 올 수 있는 방법은 정확히 4가지이며, 따라서 개의 시간에 대해 위의 테스트를 시도해보면 됩니다.
각 구슬이 어떤 시간에 있을 위치를 구할 때, 많조분으로 구하면 왜인지 모르게 틀릴 확률이 높습니다. 따라서 트랙 자체를 좌우로 반사시켜서 이어붙이고 그때 스위치의 위치들을 해시맵 등에 기록해 놓는 것이 좋습니다.