結果

問題 No.3417 Tired Santa
コンテスト
ユーザー shinchan
提出日時 2025-12-15 15:35:20
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,642 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 128 ms
コンパイル使用メモリ 12,416 KB
実行使用メモリ 11,776 KB
最終ジャッジ日時 2025-12-23 23:30:09
合計ジャッジ時間 2,924 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other RE * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

# translate by gpt
import sys
import threading
def solve():
    input = sys.stdin.readline
    INF = 10**15

    n, s = map(int, input().split())
    assert 1 <= n <= 1000 and 1 <= s <= 1000

    x = list(map(int, input().split()))
    for i in range(n - 1):
        assert x[i + 1] > x[i]
    assert x[0] > 0 and x[-1] <= 1000
    assert s not in x

    w = list(map(int, input().split()))
    assert max(w) <= 1000 and min(w) > 0

    # prefix sum of weights
    sumw = [0] * (n + 1)
    for i in range(n):
        sumw[i + 1] = sumw[i] + w[i]

    # dp[l][r][k]
    # k = 0 : currently at x[l]
    # k = 1 : currently at x[r-1]
    dp = [[[INF, INF] for _ in range(n + 1)] for __ in range(n)]

    # initialization
    for i in range(n):
        cost = abs(x[i] - s) * sumw[n]
        dp[i][i + 1][0] = cost
        dp[i][i + 1][1] = cost

    # transitions
    for l in range(n - 1, -1, -1):
        for r in range(l + 1, n + 1):
            remaining = sumw[n] - (sumw[r] - sumw[l])

            # extend to the right
            if r < n:
                dp[l][r + 1][1] = min(
                    dp[l][r + 1][1],
                    dp[l][r][0] + remaining * abs(x[l] - x[r]),
                    dp[l][r][1] + remaining * abs(x[r - 1] - x[r])
                )

            # extend to the left
            if l > 0:
                dp[l - 1][r][0] = min(
                    dp[l - 1][r][0],
                    dp[l][r][0] + remaining * abs(x[l] - x[l - 1]),
                    dp[l][r][1] + remaining * abs(x[r - 1] - x[l - 1])
                )

    print(min(dp[0][n][0], dp[0][n][1]))


if __name__ == "__main__":
    solve()
0