結果

問題 No.364 門松木
ユーザー 37zigen
提出日時 2016-06-11 02:02:11
言語 Java
(openjdk 23)
結果
WA  
実行時間 -
コード長 2,402 bytes
コンパイル時間 2,728 ms
コンパイル使用メモリ 79,580 KB
実行使用メモリ 368,656 KB
最終ジャッジ日時 2024-10-09 12:46:48
合計ジャッジ時間 31,054 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 6 WA * 1 RE * 24
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

package yukicoder;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main().solve();
}
ArrayList<Integer>[] edges = new ArrayList[50000];
int[] A;
// dp[v][A[u]]:vuv
int[][] dp = new int[50000][1001];
int[] num_up = new int[1001];// num_up[v]:v
int[] num_down = new int[1001];// num_up[v]:v
int[] sc_down = new int[1001];// sc_up[v]:vv
int[] sc_up = new int[1001];// sc_down[v]:vv
int dfs(int cur, int pre) {
int ret = 0;
for (int i = 0; i < edges[cur].size(); i++) {
int u = edges[cur].get(i);
if (pre != u) {
ret = Math.max(ret, dfs(u, cur));
if (A[cur] > A[u]) {
if (dp[u][A[cur]] >= 0) {
dp[cur][A[u]] = Math.max(sc_up[u] - dp[u][A[cur]], dp[cur][A[u]]);
} else {
dp[cur][A[u]] = Math.max(num_up[u] + sc_up[u], dp[cur][A[u]]);
}
} else if (A[cur] < A[u]) {
if (dp[u][A[cur]] >= 0) {
dp[cur][A[cur]] = Math.max(sc_down[u] - dp[u][A[cur]], dp[cur][A[cur]]);
} else {
dp[cur][A[u]] = Math.max(num_down[u] + sc_down[u], dp[cur][A[u]]);
}
}
}
}
for (int i = 1; i <= 1000; i++) {
if (dp[cur][i] >= 0) {
if (A[cur] > i) {
num_down[cur]++;
sc_down[cur] += dp[cur][i];
} else if (A[cur] < i) {
num_up[cur]++;
sc_up[cur] += dp[cur][i];
}
}
}
sc_down[cur] += num_down[cur] * (num_down[cur] - 1) / 2;
sc_up[cur] += num_up[cur] * (num_up[cur] - 1) / 2;
return Math.max(ret, Math.max(sc_down[cur], sc_up[cur]));
}
int N;
void solve() {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
A = new int[N];
for (int i = 0; i < 50000; i++)
edges[i] = new ArrayList<>();
for (int i = 0; i < 50000; i++)
for (int j = 0; j <= 1000; j++)
dp[i][j] = -1;
for (int i = 0; i < N; i++)
A[i] = sc.nextInt();
for (int i = 0; i < N - 1; i++) {
int x = sc.nextInt() - 1;
int y = sc.nextInt() - 1;
edges[x].add(y);
edges[y].add(x);
}
int ret = dfs(0, -1);
System.out.println(ret);
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0