https://www.acmicpc.net/problem/14458

 

14458번: 소가 길을 건너간 이유 10

소가 왜 길을 건너는지는 미해결 난제지만, 농부 존의 소들이 길을 자주 건넌다는 것은 잘 알려진 사실이다. 소들이 길을 건너는 일이 너무 잦아서 건너면서 부딪히는 일도 생기는데, 존은 이 상

www.acmicpc.net

초기 상태의 가로지르는 쌍은, inversion counting이므로 nlogn에 처리할 수 있다.

세그트리나 BIT, 또는 병합 정렬로 구현할 수 있다. 

 

그러면 초기 상태가 아닌, k개를 옮긴 상황은 어떻게 생각해야 할까?

 

아이디어만 설명할 것이기 때문에, 편의상 왼쪽의 목초지는 1...N이라고 두자.

또, 마지막 n-k개를 옮기는 상황이나 처음의 k개를 옮기는 상황이나 같은데, 이제 맨 앞의 목초지를 맨 뒤로 보내는 걸 반복하며 가로지르는 쌍의 개수를 업데이트하면 된다고 생각해 볼 수 있다. 

그림에서는, 1을 맨 뒤로 보냈을 때, 3,4,5와의 가로지르는 쌍은 사라지고, 2와 가로지르는 쌍이 새로 생긴다. 즉, 1이 오른쪽에서 4번째이므로, 1보다 앞에 오는 3개와의 쌍이 사라지고, 1보다 뒤에 오는 1개와 쌍이 생겼음을 쉽게 관찰할 수 있다.

1을 포함하지 않는 쌍에는 당연히 영향을 주지 않는다. 

왼쪽에서 맨 앞에 올 경우 오른쪽에서 자기보다 앞인 숫자 Index-1개와 항상 Inversion을 형성하고, 왼쪽에서 맨 뒤에 올 경우 오른쪽에서 자기보다 뒤인 숫자 N-index개와 항상 Inversion을 형성한다는 점을 활용하는 것이다.

즉, 각각의 업데이트에서 Index-1개의 Inversion이 해체되고, N-index개의 Inversion이 생긴다. 

Index는 잘 저장하면 O(1)에 접근이 가능하기에, O(1)에 inversion의 수를 업데이트할 수 있다. 한 바퀴 돌면서 왼쪽과 오른쪽에 대해 수행해 보면 O(n)에 가능한 상황을 전부 확인할 수 있다.

한번 더 적용하면 4개의 Inversion이 해체되어 최소가 된다. 이는 문제에서 주어진 TC와도 같은 형태이다. 

 

PS. 왼쪽과 오른쪽 중 하나만 하면 안된다는 걸 직관적으로는 알겠는데, 반례 찾기가 귀찮다. 알면 제보 부탁드린다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 1733 등번호  (0) 2023.02.03
백준 25257 Monty's Hall  (0) 2023.02.01
백준 6101 식당  (0) 2023.01.31
백준 3321 가장 큰 직사각형  (1) 2023.01.30
백준 20189 사탕 돌리기  (0) 2023.01.29

+ Recent posts