結果
| 問題 |
No.364 門松木
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-06-11 11:43:55 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 173 ms / 3,000 ms |
| コード長 | 2,120 bytes |
| コンパイル時間 | 562 ms |
| コンパイル使用メモリ | 64,352 KB |
| 実行使用メモリ | 208,128 KB |
| 最終ジャッジ日時 | 2024-10-09 12:50:46 |
| 合計ジャッジ時間 | 5,922 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
// ConsoleApplication8.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
vector<int> edges[50000];
int A[50001];
// dp[v][A[u]]:頂点vの子頂点uをvにつないだ時の門松列の総数
int dp[50001][1001];
int num_up[50001];// num_up[v]:頂点vの持つ数字より大きい数を持つ子頂点の数
int num_down[50001];// num_up[v]:頂点vの持つ数字より小さい数を持つ子頂点の数
int sc_down[50001];// sc_up[v]:頂点vの子頂点がvより小さくなるような場合に含める最大の門松列の総数
int sc_up[50001];// sc_down[v]:頂点vの子頂点がvより大きくなるな場合に含める最大の門松列の総数
int cnt = 0;
int dfs(int cur, int pre) {
int ret = 0;
for (auto& u:edges[cur]) {
if (pre != u) {
ret = max(ret, dfs(u, cur));
if (A[cur] > A[u]) {
if (dp[u][A[cur]] >= 0) {
dp[cur][A[u]] = max(sc_up[u] - dp[u][A[cur]], dp[cur][A[u]]);
}
else {
dp[cur][A[u]] = 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[u]] = max(sc_down[u] - dp[u][A[cur]], dp[cur][A[cur]]);
}
else {
dp[cur][A[u]] = 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 max(ret, max(sc_down[cur], sc_up[cur]));
}
int N;
void solve() {
int x, y;
cin>>N;
memset(dp, -1, sizeof(dp));
for (int i = 0; i < N; i++)
cin >> A[i];
for (int i = 0; i < N - 1; i++) {
cin >> x >> y;
edges[x-1].push_back(y-1);
edges[y-1].push_back(x-1);
}
int ret = dfs(0, -1);
cout<<ret;
}
int main()
{
solve();
return 0;
}