Loading

JSOI2013 哈利波特与死亡圣器

显然可以二分答案。观察 B 的策略,显然不会回头,如果走到一个点,其儿子数 \(> k\) 就赢了。

于是每次多出来的用于染这样的子节点,记 \(f_u\) 表示考虑 \(u\) 子树,至多要外面多少次结余给 \(u\) 子树内的点染色。\(f_u = \sum\limits_{v\in\text{son}_u} \max(f_v, 0) + |\text{son}_u|-k\)
时间复杂度 \(\mathcal{O}(n \log n)\)

namespace Loop1st {
int n, k, f[N];
vector<int>e[N];
void dfs(int u, int fa) {
    f[u] = 0;
    int son = (int)e[u].size() - (u != 1);
    for (int v : e[u]) if (v != fa) {
        dfs(v, u);
        f[u] += max(f[v], 0);
    }
    f[u] += son - k;
}
bool check() {
    dfs(1, 0);
    return f[1] <= 0;
}
void main() {
    cin >> n;
    for (int i = 1, u, v; i < n; i++) {
        cin >> u >> v;
        e[u].push_back(v); e[v].push_back(u);
    }
    int L = -1, R = n;
    while (L + 1 < R) {
        int mid = (L + R) >> 1;
        k = mid;
        if (check()) R = mid;
        else L = mid;
    }
    cout << R << '\n';
}

}
posted @ 2026-03-13 10:08  循环一号  阅读(1)  评论(0)    收藏  举报