結果

問題 No.3322 引っ張りだこ
コンテスト
ユーザー 高橋ゆに
提出日時 2025-10-05 21:58:38
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 891 ms / 2,000 ms
コード長 1,124 bytes
コンパイル時間 372 ms
コンパイル使用メモリ 82,648 KB
実行使用メモリ 132,080 KB
最終ジャッジ日時 2025-10-31 20:30:53
合計ジャッジ時間 18,705 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 43
権限があれば一括ダウンロードができます

ソースコード

diff #

def max_score(a, b): 
    if a[0] != b[0]:
        return max(a, b)
    else:
        return min(a, b)

def solve():
    N, K = map(int, input().split())
    A = list(map(int, input().split()))
    B = list(map(int, input().split()))
    
    INF = 1 << 60
    ODD = K % 2
    EVEN = ODD ^ 1
    H = K // 2
    
    def alien_dp(cost):
        dpa = (0, 0)
        dpb = (-INF, 0)
        for i in range(N):
            ndpa = max_score((dpa[0] + A[i], dpa[1]), (dpb[0] + A[i] - cost * ODD, dpb[1] + ODD))
            ndpb = max_score((dpa[0] + B[i] - cost * EVEN, dpa[1] + EVEN), (dpb[0] + B[i], dpb[1]))
            dpa = ndpa
            dpb = ndpb
        return max(dpa, dpb)
    
    score, cnt = alien_dp(0)
    if cnt <= H:
        print(score)
        return
    
    ng, ok = 0, INF
    while ok - ng > 1:
        med = (ng + ok) // 2
        score, cnt = alien_dp(med)
        if cnt > H:
            ng = med
        else:
            ok = med
    score, cnt = alien_dp(ok)
    print(score + ok * H)

def main():
    T = int(input())
    for _ in range(T):
        solve()

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