結果
| 問題 |
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]));
}
}
ks2m