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