結果

問題 No.2100 [Cherry Alpha C] Two-way Steps
ユーザー lam6er
提出日時 2025-03-20 20:28:55
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 277 ms / 2,000 ms
コード長 2,091 bytes
コンパイル時間 182 ms
コンパイル使用メモリ 82,096 KB
実行使用メモリ 131,276 KB
最終ジャッジ日時 2025-03-20 20:29:52
合計ジャッジ時間 11,932 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 48
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input = sys.stdin.read

def main():
    data = input().split()
    idx = 0
    N = int(data[idx]); idx +=1
    M = int(data[idx]); idx +=1
    
    H = [0]*(N+1)
    for i in range(N):
        H[i+1] = int(data[idx])
        idx +=1
    
    cherry_edges = [[] for _ in range(N+1)]
    zelkova_edges = [[] for _ in range(N+1)]
    for _ in range(M):
        X = int(data[idx]); idx +=1
        Y = int(data[idx]); idx +=1
        cherry_edges[X].append(Y)
        zelkova_edges[Y].append(X)
    
    INF = float('-inf')
    
    # Cherry's DP
    cherry_dp0 = [INF] * (N + 1)
    cherry_dp1 = [INF] * (N + 1)
    cherry_dp0[1] = 0
    
    for u in range(1, N+1):
        current_max = max(cherry_dp0[u], cherry_dp1[u])
        for v in cherry_edges[u]:
            if H[u] < H[v]:
                if cherry_dp0[u] != INF:
                    new_val = cherry_dp0[u] + (H[v] - H[u])
                    if new_val > cherry_dp1[v]:
                        cherry_dp1[v] = new_val
            else:
                if current_max != INF:
                    if current_max > cherry_dp0[v]:
                        cherry_dp0[v] = current_max
    
    ans_cherry = max(cherry_dp0[N], cherry_dp1[N])
    if ans_cherry == INF:
        ans_cherry = -1
    
    # Zelkova's DP
    zelkova_dp0 = [INF] * (N + 1)
    zelkova_dp1 = [INF] * (N + 1)
    zelkova_dp0[N] = 0
    
    for u in range(N, 0, -1):
        current_max = max(zelkova_dp0[u], zelkova_dp1[u])
        for x in zelkova_edges[u]:
            if H[u] < H[x]:
                if zelkova_dp0[u] != INF:
                    new_val = zelkova_dp0[u] + (H[x] - H[u])
                    if new_val > zelkova_dp1[x]:
                        zelkova_dp1[x] = new_val
            else:
                if current_max != INF:
                    if current_max > zelkova_dp0[x]:
                        zelkova_dp0[x] = current_max
    
    ans_zelkova = max(zelkova_dp0[1], zelkova_dp1[1])
    if ans_zelkova == INF:
        ans_zelkova = -1
    
    print(ans_cherry)
    print(ans_zelkova)

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