結果
| 問題 |
No.3306 Life is Easy?
|
| コンテスト | |
| ユーザー |
sepa38
|
| 提出日時 | 2025-09-28 08:45:27 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,136 bytes |
| コンパイル時間 | 563 ms |
| コンパイル使用メモリ | 82,912 KB |
| 実行使用メモリ | 82,172 KB |
| 最終ジャッジ日時 | 2025-09-28 08:45:49 |
| 合計ジャッジ時間 | 20,476 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 TLE * 3 |
ソースコード
def hungarian(n, c):
w2j = list(range(n))
j2w = list(range(n))
p = [0] * n
for i in range(1, n):
cost = [1 << 60] * n
prev = [-1] * n
for j in range(i):
cost[j2w[j]] = c[i][j] - c[j2w[j]][j] - p[j2w[j]]
prev[j2w[j]] = i
flg = [0] * n
for j in range(i):
min_c = 1 << 60
cur_j = -1
for k in range(i):
if not flg[k] and min_c > cost[k]:
min_c = cost[k]
cur_j = k
flg[cur_j] = 1
for k in range(i):
new_c = cost[cur_j] + c[cur_j][k] - c[j2w[k]][k] - (p[j2w[k]] - p[cur_j])
if cost[j2w[k]] > new_c:
cost[j2w[k]] = new_c
prev[j2w[k]] = cur_j
best_c = c[i][i]
best_j = -1
for j in range(i):
if best_c > cost[j] + p[j] + c[j][i]:
best_c = cost[j] + p[j] + c[j][i]
best_j = j
for j in range(i):
p[j] += cost[j]
next_i = i
while best_j != -1:
j2w[next_i] = best_j
next_i, w2j[best_j] = w2j[best_j], next_i
best_j = prev[best_j]
return w2j
def solve(n, m, a):
d = n // 2
if m == 1:
ans = 0
for i in range(d):
ans += a[~i][0] - a[i][0]
return ans
elif False:
dp1 = [[1<<60] * (d + 1) for _ in range(d+1)]
dp1[0][0] = 0
for i in range(d):
for j in range(i+1):
dp1[i+1][j] = min(dp1[i+1][j], dp1[i][j]+a[i][0])
dp1[i+1][j+1] = min(dp1[i+1][j+1], dp1[i][j]+a[i][1])
dp2 = [[0] * (d + 1) for _ in range(d+1)]
for i in range(d):
for j in range(i+1):
dp2[~i-1][j] = max(dp2[~i-1][j], dp2[~i][j]+a[~i][0])
dp2[~i-1][j+1] = max(dp2[~i-1][j+1], dp2[~i][j]+a[~i][1])
ans = 0
for i in range(d+1):
ans = max(ans, dp2[0][i]-dp1[d][i])
return ans
c = [[0] * d for _ in range(d)]
for i in range(d):
for j in range(d):
x = 0
for k in range(m):
x = max(x, a[j+d+n%2][k] - a[i][k])
c[i][j] = -x
res = hungarian(d, c)
ans = 0
for i in range(d):
ans -= c[i][res[i]]
return ans
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
print(solve(n, m, a))
sepa38