Submission #1271263

#TimeUsernameProblemLanguageResultExecution timeMemory
1271263chikien2009Meetings 2 (JOI21_meetings2)C++20
0 / 100
1 ms328 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n, a, b;
int sz[200000], res[400001];
vector<int> g[200000];
bool mark[200000];

inline void Cal(int node, int par)
{
    sz[node] = 1;
    for (auto &i : g[node])
    {
        if (i != par && !mark[i])
        {
            Cal(i, node);
            sz[node] += sz[i];
        }
    }
}

inline int FindCentroid(int node, int par, int cur)
{
    for (auto &i : g[node])
    {
        if (i != par && sz[i] * 2 > cur && !mark[i])
        {
            return FindCentroid(i, node, cur);
        }
    }
    return node;
}

inline void Get(int node, int par, int depth, vector<int> &inp)
{
    sz[node] = 1;
    for (auto &i : g[node])
    {
        if (i != par && !mark[i])
        {
            Get(i, node, depth + 1, inp);
            sz[node] += sz[i];
        }
    }
    inp[sz[node]] = max(inp[sz[node]], depth);
}

inline void DFS(int node)
{
    int centroid;
    vector<int> cur, temp;
    Cal(node, node);
    centroid = FindCentroid(node, node, sz[node]);
    mark[centroid] = true;
    cur.resize(sz[node], -1);
    temp.resize(sz[node], -1);
    if (sz[node] > 1)
    {
        cur[1] = 0;
    }
    for (auto &i : g[centroid])
    {
        if (!mark[i])
        {
            Get(i, centroid, 1, temp);
            for (int j = sz[i]; j >= 0; --j)
            {
                if (j < sz[i])
                {
                    temp[j] = max(temp[j], temp[j + 1]);
                }
                if (cur[j] != -1)
                {
                    res[j * 2] = max(res[j * 2], cur[j] + temp[j]);
                }
                if (1 <= j && cur[j - 1] == 1)
                {
                    res[j * 2] = max(res[j * 2], temp[j]);
                }
                cur[j] = max(cur[j], temp[j]);
            }
            if (sz[i] + 1 < cur.size() && cur[sz[i] + 1] != -1)
            {
                res[(sz[i] + 1) * 2] = max(res[(sz[i] + 1) * 2], cur[sz[i] + 1]);
            }
            fill_n(temp.begin(), sz[i] + 1, -1);
        }
    }
    for (auto &i : g[centroid])
    {
        if (!mark[i])
        {
            DFS(i);
        }
    }
}

int main()
{
    setup();

    cin >> n;
    for (int i = 0; i < n - 1; ++i)
    {
        cin >> a >> b;
        g[a - 1].push_back(b - 1);
        g[b - 1].push_back(a - 1);
    }
    DFS(0);
    for (int i = 1; i <= n; ++i)
    {
        cout << (i & 1 ? 0 : res[i]) + 1 << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...