-
[백준 25380] 커다란 도시(2022 정보 올림피아드 예선 중2)코딩 2022. 9. 4. 11:16728x90
https://www.acmicpc.net/problem/25380
25380번: 커다란 도시
KOI시는 너무나 커다라서, 이동하려면 시간이 오래 걸린다. 그래서 KOI시는 도시를 관통하는 아주 긴 도로를 건설하였다. 도로는 남북 방향 또는 동서 방향으로 무한히 뻗어 나간다. 남북 방향의
www.acmicpc.net
매년 최고 난이도를 갱신하는 정보 올림피아드 문제들을 보면서 오늘도 능지의 한계를 느끼는 나.
문제들이 하나같이 호락호락하지가 않은데 이 문제도 한 3일은 고민해서 푼 것 같다 ㅋㅋㅋ
근데 정보 올림피아드 문제들 공식 풀이가 있다는 사실을 어제 알아가지고 정해를 봤는데 내 방법이 더 깔끔하고 괜찮아 보였다.
시간이 획기적으로 빨라진다거나 그런건 아닌데 수학적으로 더 아름답고 구현도 편한 느낌?
태그 보니까 누적 합, 이분 탐색 등등 있던데 내 풀이는 이분 탐색 그런거 없고 정렬만 쓸 것이다.
그럼 지금부터 시작
부분 점수 항목을 보니까 이런 게 있었다.1 14 M = 1. 2 11 모든 경찰은 두 도로가 교차하는 지점에만 배치된다. 3 20 1 ≤ N, M ≤ 20. 4 25 1 ≤ N, M ≤ 1 000. 5 30 추가 제약 조건 없음. 여기서 2번 서브태스크를 보고 일단 이 상황에서 풀리는 공식을 만들고 본 문제에 더 적용해볼 것이다.
모든 경찰은 두 도로가 교차하는 지점에만 배치된다는 것은 무엇을 의미할까?
경찰 두 명이 만나려고 할 때 방향이 맞게 길만 따라가면 그게 곧 최단거리가 됨을 의미한다.
일단 문제에서 축에 평행한 도로y 이 있고,a1,a2,...,an
x축에 평행한 도로 이 있다고 했다.b1,b2,...bm
경찰들이 명 있다고 했으니까 각 경찰을k 라고 한다면..p1,p2,...,pk
일단 이 경찰들이 이동하는 거리중에 x축으로 이동하는 거리도 있겠고 y축으로 이동하는 거리도 있을 것이다
근데 우리는 그걸 각각 따로 분리해서 생각할 것이다. 어차피 모든 쌍에 대한 경찰들의 이동 거리만 구하면 되니까 따로 더해도 별 상관은 없음이 그림 보면 파란점이 주황점으로 갈 때
축 타고y 이동했고4 축 타고x 이동해서 합계가7 인데 이걸 따로 분리해서 생각하자는 것이다.11
일단 경찰들이 x축으로 이동한 거리만 계산해보자.
그럼 그 문제를 다음과 같이 바꿀 수 있다.
수직선 위에 경찰이 명 있다.k 는P1,P2,...,Pk 의 x좌표를 정렬해서 다시 번호를 붙였다고 보면 된다.p1∼pk (P1≤P2≤...≤Pk−1≤Pk)
이때 를 구하시오.k∑i=1(k∑j=i+1|Pi−Pj|)
그럼 점들이 이렇게 있을텐데
일부만 예시를 들어 설명해 보자면, 가 총 몇 번 지나다니게 되는지 알아보면 된다.Pi+1−Pi
예를 들어 와P2 사이의 거리는P3 왼쪽에 점이 2개 있고, (P2 포함해서 2개)P2 오른쪽에 3개 있기 때문에 총P3 번 지나다니게 되는 셈이다.2×3=6 k−1∑i=1(Pi+1−Pi)(n−i)i
최종적으로 시간에 정렬하고 모든 쌍들의 거리를 구하는데는O(nlogn) 이라서O(n) 이 걸렸다.O(nlogn)
여기까진 정석 풀이랑 똑같아서 글의 핵심이 아니니깐..
아무튼 문제는 이제 교차점말고 다른 곳에 경찰이 서 있을 때이다
왜냐하면 최단 경로가 빙 돌아서 가야 하는 경우가 생기기 때문이다
근데 우리는 앞에서 교차점에 서 있을 때의 정답을 구할 수 있으니까
그걸 이미 더해놓고 남은 찌끄레기들만 더해 주면 된다.
근데 점 가 있을 때 이 두 점 사이에 세로선이 하나라도 있으면 찌끄레기는 없다고 봐도 무방하다.Pi,Pj
돌아서 갈 필요가 없기 때문이다. 따라서 중간에 세로선이 없는 점들의 집합만 어떻게 잘 해주면 되는데
점 2개만 있을 때 어떤 경로가 더 가까운지 확인해 보자면.. 를di 의 양쪽 세로선 중 더 가까운 거리라고 정의했을때,Pi 과d1 를 비교해서 더 작은 쪽의 방향으로 가는게 더 가까운 거리이다.d2
근데 은 결과적으로 2번 지나다니는 셈이 되니 2번 더해줘야 한다.d1 점 여러개 있는 경우로 확장해 보자.
각
를 모두 구해서 정렬한 뒤에di 부터1 까지 다시 번호를 붙인다.k 이때 정석 풀이에서는, 각
에 대해 어떤 지점까지는 왼쪽으로 돌아가는 게 더 가까운 경로이고 어떤 지점부터는 오른쪽으로 돌아가는 게 더 가까운 경로이기 때문에 이 부분을 이진 탐색으로 찾아주었다.di 하지만 나는 다른 방법으로 이를 구했다.
입장에서는 자신을 이용해서 만든 경로가 4개 있다.(자신을 제외한 나머지 점 4개로 가는 경로들)d1 따라서
를 더해준다.d1×4×2 는 경로가 3개 있다.(자신과d2 을 제외한 나머지 점 3개로 가는 경로들)d1
마찬가지로 를 더해준다.d1×3×2 로 일반화하면 다음과 같다.k 2k∑i=1(k−i)di
그리고 앞에서 말했듯이 이건 가로로 걸어간 길이만 구한건데 세로도 별거 없다.
걍 앞에서 한거랑 똑같이 하면 된다.728x90'코딩' 카테고리의 다른 글
[백준 11051] 이항 계수2 (0) 2022.12.03 [백준 1413] 박스 안의 열쇠 (0) 2022.09.25 [백준 14556] Balance (2) 2022.09.07 [백준 16565] N포커 (1) 2022.09.04 첫 글 (0) 2022.08.28