結果
| 問題 | No.3585 Make Ends Meet (Easy) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-25 07:19:21 |
| 言語 | Python3 (3.14.3 + numpy 2.4.4 + scipy 1.17.1) |
| 結果 |
AC
|
| 実行時間 | 100 ms / 2,000 ms |
| コード長 | 2,006 bytes |
| 記録 | |
| コンパイル時間 | 295 ms |
| コンパイル使用メモリ | 21,536 KB |
| 実行使用メモリ | 15,996 KB |
| 最終ジャッジ日時 | 2026-07-10 20:51:19 |
| 合計ジャッジ時間 | 7,070 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 48 |
ソースコード
N, M, K = map(int, input().split())
T = N * (N - 1) // 2
ans = []
def print_no():
print("No")
def print_yes():
print("Yes")
for u, v in ans:
print(u, v)
if K == 1:
# Distance is 1 iff the edge (1, N) remains.
if M == T:
print_no()
exit()
for u in range(1, N + 1):
for v in range(u + 1, N + 1):
if u == 1 and v == N:
continue
if len(ans) < M:
ans.append((u, v))
print_yes()
exit()
# K >= 2.
min_removed = K * (K - 1) // 2 + (N - K - 1) * (K - 2)
max_removed = T - K # at least K edges of a shortest path must remain.
if not (min_removed <= M <= max_removed):
print_no()
exit()
# Use the path 1 - 2 - ... - K - N.
path = []
path.append(1)
for v in range(2, K + 1):
path.append(v)
path.append(N)
is_path_edge = [[False] * (N + 1) for _ in range(N + 1)]
for i in range(len(path) - 1):
a = path[i]
b = path[i + 1]
if a > b:
a, b = b, a
is_path_edge[a][b] = True
# Intended distance layer (BFS tree) of each vertex.
layer = [-1] * (N + 1)
layer[1] = 0
for i in range(1, K):
layer[i + 1] = i
layer[N] = K
# Make extra vertices belong to layer 1.
for v in range(K + 1, N):
layer[v] = 1
removed = [[False] * (N + 1) for _ in range(N + 1)]
# First remove all edges whose layer difference is at least 2 (Since it makes a shortcut).
# This is the minimum-removal construction.
for u in range(1, N + 1):
for v in range(u + 1, N + 1):
if abs(layer[u] - layer[v]) >= 2:
removed[u][v] = True
ans.append((u, v))
# Remove additional non-path edges arbitrarily until exactly M edges are removed.
for u in range(1, N + 1):
if len(ans) >= M:
break
for v in range(u + 1, N + 1):
if len(ans) >= M:
break
if removed[u][v]:
continue
if is_path_edge[u][v]:
continue
removed[u][v] = True
ans.append((u, v))
print_yes()