#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |