64分 求调必关
查看原帖
64分 求调必关
1473722
Q1021楼主2025/8/2 09:49
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define db double
#define pii pair<int, int>
#define pdd pair<db, db>
#define x first
#define y second
#define eb(x) emplace_back(x)
#define pb push_back
#define vc vector
#define re(x) memset(x, 0, sizeof x)
#define ull unsigned long long
#define ll long long
#define IOS cin.tie(0), cout.tie(0)->ios::sync_with_stdio(0);
#define lll __int128
#define ulll __uint128_t
#define endl '\n'
#define umap unordered_map
#define uset unordered_set
#define all(x) x.begin(), x.end()
#define lowbit(x) x & -x
#define ls(x) x << 1
#define rs(x) x << 1 | 1
const int INF = 1e10, mod = 1e9 + 7;
const int N = 1e6 + 100;
void NO() { cout << "NO" << endl; }
void YES() { cout << "YES" << endl; }
int MOD(int x) { return x % mod; }
inline void input(lll &s)
{
    s = 0;
    char c = ' ';
    while (c > '9' || c < '0')
        c = getchar();
    while (c >= '0' && c <= '9')
    {
        s = s * 10 + c - '0';
        c = getchar();
    }
}
inline void output(lll x)
{
    if (x > 9)
        output(x / 10);
    putchar(x % 10 + '0');
}
int dx[4] = {0, -1, 1, 0};
int dy[4] = {1, 0, 0, -1};

void AC()
{
    int n;
    cin >> n;
    vc<vc<int>> g(n + 1);
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
    int l = 0, r = n;
    int ans = 0;
    int lim;
    int pd = 0;
    /*
        sy代表剩余,若有剩余则表示儿子还可以继续用父亲剩余的操作
    */
    auto dfs = [&](auto dfs, int u, int p, int sy) -> void
    {
        //  cout << u << ' ' << sy << endl;
        if (pd == 0)
            return;
        int cnt = 0;
        for (int v : g[u])
        {
            if (v != p)
                cnt++;
        }
        if (lim + sy < cnt) // 加上之前剩余的还不满足就不行
        {
            // cout << "ww" << endl;
            pd = 0;
            return;
        }
        for (int v : g[u])
        {
            if (v != p)
            {

                dfs(dfs, v, u, sy + lim - cnt);
            }
        }
    };
    auto check = [&](int x)
    {
        // cout << x << endl;
        lim = x;
        pd = 1;
        dfs(dfs, 1, 0, 0);
        //   cout << "pd" << pd << endl;
        return pd;
    };

    while (l <= r)
    {
        int mid = l + r >> 1;
        if (check(mid))
            r = mid - 1, ans = mid;
        else
            l = mid + 1;
    }
    cout << ans << endl;

    return;
}

signed main()
{

    IOS;
    int _ = 1;
    // cin >> _;

    while (_--)
    {

        AC();
    }
    return 0;
}
2025/8/2 09:49
加载中...