結果
問題 | No.2100 [Cherry Alpha C] Two-way Steps |
ユーザー | ks2m |
提出日時 | 2022-10-14 21:59:28 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 870 ms / 2,000 ms |
コード長 | 2,112 bytes |
コンパイル時間 | 2,437 ms |
コンパイル使用メモリ | 78,796 KB |
実行使用メモリ | 84,348 KB |
最終ジャッジ日時 | 2024-06-26 13:57:42 |
合計ジャッジ時間 | 28,529 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 48 |
ソースコード
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] sa = br.readLine().split(" "); int n = Integer.parseInt(sa[0]); int m = Integer.parseInt(sa[1]); sa = br.readLine().split(" "); int[] h = new int[n]; for (int i = 0; i < n; i++) { h[i] = Integer.parseInt(sa[i]); } List<List<Integer>> listL = new ArrayList<>(n); List<List<Integer>> listR = new ArrayList<>(n); for (int i = 0; i < n; i++) { listL.add(new ArrayList<>()); listR.add(new ArrayList<>()); } for (int i = 0; i < m; i++) { sa = br.readLine().split(" "); int x = Integer.parseInt(sa[0]) - 1; int y = Integer.parseInt(sa[1]) - 1; listL.get(x).add(y); listR.get(y).add(x); } br.close(); long[] dplu = new long[n]; long[] dpld = new long[n]; long[] dpru = new long[n]; long[] dprd = new long[n]; Arrays.fill(dplu, -1); Arrays.fill(dpld, -1); Arrays.fill(dpru, -1); Arrays.fill(dprd, -1); dpld[0] = 0; dprd[n - 1] = 0; for (int i = 0; i < n - 1; i++) { if (dpld[i] != -1) { for (int j : listL.get(i)) { if (h[i] < h[j]) { dplu[j] = Math.max(dplu[j], dpld[i] + h[j] - h[i]); } else { dpld[j] = Math.max(dpld[j], dpld[i]); } } } if (dplu[i] != -1) { for (int j : listL.get(i)) { if (h[i] > h[j]) { dpld[j] = Math.max(dpld[j], dplu[i]); } } } } for (int i = n - 1; i > 0; i--) { if (dprd[i] != -1) { for (int j : listR.get(i)) { if (h[i] < h[j]) { dpru[j] = Math.max(dpru[j], dprd[i] + h[j] - h[i]); } else { dprd[j] = Math.max(dprd[j], dprd[i]); } } } if (dpru[i] != -1) { for (int j : listR.get(i)) { if (h[i] > h[j]) { dprd[j] = Math.max(dprd[j], dpru[i]); } } } } System.out.println(Math.max(dplu[n - 1], dpld[n - 1])); System.out.println(Math.max(dpru[0], dprd[0])); } }