DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

yet another mst problem

返回题目

题解

1. 옮긴 점의 후보 위치

옮길 점을 rrr번 점이라고 하자. 나머지 점들의 집합을 QQQ라고 하고, 옮긴 뒤의 점을 sss라고 하자.

최적해의 어떤 스패닝 트리를 고정하자. sss와 인접한 점들의 집합을 AAA라고 하면, sss의 위치에 따라 달라지는 비용은 다음과 같다.

∑i∈A∣xs−xi∣+∑i∈A∣ys−yi∣\sum_{i \in A} |x_s-x_i| + \sum_{i \in A} |y_s-y_i|i∈A∑​∣xs​−x

두 합은 독립적이다. 절댓값 합은 중앙값에서 최소가 되므로, 최적의 xsx_sxs​는 AAA에 속한 점 하나의 xxx좌표로, 최적의 ysy_sys​는 에 속한 점 하나의 좌표로 잡을 수 있다.

따라서 QQQ에 나타나는 xxx좌표와 yyy좌표의 모든 조합만 확인하면 충분하다. 후보 위치는 최대 (N−1)2(N-1)^2(N−1)2개이다. N=이면 답은 이다.

2. 남은 점들의 MST 하나만 사용하기

QQQ의 완전 그래프를 GGG라고 하고, 그 MST 하나를 KKK라고 하자. 후보 위치 sss를 추가하면 sss와 QQQ의 모든 점을 잇는 간선들이 새로 생긴다.

GGG의 모든 간선을 다시 사용할 필요는 없다. KKK의 간선과 sss에서 나가는 간선만으로도 확장된 그래프의 MST를 만들 수 있다.

이를 보이기 위해, 확장된 그래프의 MST 가운데 KKK에 속하지 않는 기존 간선의 수가 최소인 것을 고르자. 그런 간선 eee가 남아 있다고 하자. KKK에서 eee의 양 끝점을 잇는 경로의 모든 간선 중 최댓값은 eee의 가중치 이하이다. MST에서 eee를 지워 생기는 절단을 이 경로가 가로지르므로, 그 절단을 가로지르는 의 간선 가 존재한다. 대신 를 넣으면 가중치는 증가하지 않고 밖의 기존 간선 수가 줄어 모순이다.

따라서 각 후보 위치에서는 정점이 ∣Q∣+1|Q|+1∣Q∣+1개이고 간선이 2∣Q∣−12|Q|-12∣Q∣−1개인 그래프에 크루스칼 알고리즘을 적용하면 된다.

3. 새 간선을 선형 시간에 정렬하기

KKK의 간선은 옮길 점 rrr을 고정한 동안 변하지 않으므로 한 번만 정렬한다. 후보 위치를 (X,Y)(X,Y)(X,Y)라고 하자. QQQ의 점을 다음 네 영역으로 나눈다.

  • xi≤Xx_i \leq Xxi​≤X, yi≤Yy_i \leq Yyi​≤Y: 거리는 이므로 의 내림차순이다.

각 기준으로 점들을 미리 정렬한다. 한 후보 위치에서 각 정렬을 순회하며 해당 영역의 점만 남기면, sss에서 나가는 간선은 네 개의 정렬된 열로 표현된다. 네 열과 정렬된 KKK의 간선을 동시에 병합하면서 크루스칼 알고리즘을 수행할 수 있다. 한 후보 위치의 계산량은 O(N)O(N)O(N)이다.

4. 전체 알고리즘

각 옮길 점 rrr에 대해 다음을 수행한다.

  • QQQ의 맨해튼 완전 그래프에서 프림 알고리즘으로 MST KKK를 구한다.
  • QQQ의 서로 다른 xxx좌표와 yyy좌표의 모든 조합을 후보 위치로 확인한다.
  • 각 후보에서 KKK의 간선과 에서 나가는 간선을 병합하여 크루스칼 알고리즘을 수행한다.

첫 번째 관찰에 의해 어떤 최적해의 옮긴 위치가 후보에 포함된다. 두 번째 관찰에 의해 그 후보의 MST는 KKK와 새 간선만으로 정확히 계산된다. 모든 옮길 점을 확인하므로 알고리즘이 구한 최솟값이 정답이다.

옮길 점 하나마다 후보가 O(N2)O(N^2)O(N2)개이고 후보 하나를 O(N)O(N)O(N)에 처리한다. 모든 옮길 점을 확인하므로 시간 복잡도는 O(N4)O(N^4)O(N4)이고, 메모리 복잡도는 이다.

Solution written by GPT5.6

i​
∣
+
i∈A∑​∣ys​−
yi​∣
AAA
yyy
1N=1
N=1
000
KK
K
fff
eee
fff
KKK
X+Y−(xi+yi)X+Y-(x_i+y_i)
X+Y−(xi​+yi​)
xi+yix_i+y_ixi​+yi​
  • xi≤Xx_i \leq Xxi​≤X, yi>Yy_i > Yyi​>Y: 거리는 X−Y+(yi−xi)X-Y+(y_i-x_i)X−Y+(yi​−xi​)이므로 yi−xiy_i-x_iyi​−xi​의 오름차순이다.
  • xi>Xx_i > Xxi​>X, yi≤Yy_i \leq Yyi​≤Y: 거리는 −X+Y+(xi−yi)-X+Y+(x_i-y_i)−X+Y+(xi​−yi​)이므로 xi−yix_i-y_ixi​−yi​의 오름차순이다.
  • xi>Xx_i > Xxi​>X, yi>Yy_i > Yyi​>Y: 거리는 −X−Y+(xi+yi)-X-Y+(x_i+y_i)−X−Y+(xi​+yi​)이므로 xi+yix_i+y_ixi​+yi​의 오름차순이다.
  • ss
    s
    O(N2)O(N^2)O(N2)