結果
| 問題 |
No.3206 う し た ウ ニ 木 あ く ん 笑
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-18 22:58:33 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 244 ms / 3,000 ms |
| コード長 | 3,027 bytes |
| コンパイル時間 | 2,879 ms |
| コンパイル使用メモリ | 285,096 KB |
| 実行使用メモリ | 34,692 KB |
| 最終ジャッジ日時 | 2025-07-18 22:58:41 |
| 合計ジャッジ時間 | 7,223 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
const int MAXN = 200005;
vector<int> to[MAXN];
int dv[MAXN], uv[MAXN];
int bdr[MAXN], sbr[MAXN], cbr[MAXN];
int pa[MAXN];
long long ans = 0;
void dfs1(int u, int p) {
pa[u] = p;
dv[u] = 0;
bdr[u] = -1;
sbr[u] = -1;
cbr[u] = 0;
for (int v : to[u]) {
if (v == p) continue;
dfs1(v, u);
int child_down = dv[v];
if (child_down > bdr[u]) {
sbr[u] = bdr[u];
bdr[u] = child_down;
cbr[u] = 1;
} else if (child_down == bdr[u]) {
cbr[u]++;
} else if (child_down > sbr[u]) {
sbr[u] = child_down;
}
dv[u] = max(dv[u], child_down + 1);
}
}
void dfs2(int u, int p) {
if (p != -1) {
int other_max;
if (dv[u] == bdr[p]) {
if (cbr[p] > 1) {
other_max = bdr[p];
} else {
other_max = sbr[p];
}
} else {
other_max = bdr[p];
}
if (other_max == -1) {
uv[u] = uv[p] + 1;
} else {
uv[u] = max(uv[p] + 1, other_max + 2);
}
}
for (int v : to[u]) {
if (v == p) continue;
dfs2(v, u);
}
}
int main() {
int n;
cin >> n;
rep(i, n-1) {
int u, v;
cin >> u >> v;
to[u].push_back(v);
to[v].push_back(u);
}
dfs1(1, -1);
uv[1] = 0;
for (int child : to[1]) {
dfs2(child, 1);
}
ans = 0;
for (int u = 1; u <= n; u++) {
vector<int> branches;
if (pa[u] != -1) {
int p = pa[u];
int other_max;
if (dv[u] == bdr[p]) {
if (cbr[p] > 1) {
other_max = bdr[p];
} else {
other_max = sbr[p];
}
} else {
other_max = bdr[p];
}
int depth_pa;
if (other_max == -1) {
depth_pa = uv[p];
} else {
depth_pa = max(uv[p], other_max + 1);
}
branches.push_back(depth_pa);
}
for (int v : to[u]) {
if (v == pa[u]) continue;
branches.push_back(dv[v]);
}
if (branches.empty()) {
ans = max(ans, 1ll);
continue;
}
sort(branches.begin(), branches.end(), greater<int>());
int m = branches.size();
long long now = 0;
int i = 0;
while (i < m) {
int v = branches[i];
auto it = upper_bound(branches.begin(), branches.end(), v, greater<int>());
int cnt = it - branches.begin();
long long t = 1 + (long long)cnt * (v + 1);
now = max(now, t);
while (i < m && branches[i] == v) {
i++;
}
}
ans = max(ans, now);
}
cout << ans << '\n';
return 0;
}