Submission #805564

#TimeUsernameProblemLanguageResultExecution timeMemory
805564vjudge1Meetings 2 (JOI21_meetings2)C++17
20 / 100
4099 ms46416 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int B = 1000; const int N = 3e5 + 10; const int INF = 1e9; vector<int> g[N]; int n; int sz[N]; int anc[N][20]; int tin[N], tout[N], T, depth[N]; void precalc(int s, int p) { if(s == p) T = 0, depth[s] = 0; sz[s] = 1; anc[s][0] = p; tin[s] = T++; for(int i = 1; i < 20; i++) anc[s][i] = anc[anc[s][i - 1]][i - 1]; for(int to : g[s]) { if(to == p) continue; depth[to] = depth[s] + 1; precalc(to, s); sz[s] += sz[to]; } tout[s] = T++; } bool up(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; } int lca(int u, int v) { if(up(u, v)) return u; if(up(v, u)) return v; for(int i = 19; i >= 0; i--) { if(!up(anc[u][i], v)) u = anc[u][i]; } return anc[u][0]; } int dist(int u, int v) { return depth[u] + depth[v] - 2 * depth[lca(u, v)]; } int root; vector<int> rs(N, 1); int LIM; int dfs(int s, int p, int k) { if(k > LIM) return 0; int f = -INF; if(sz[s] >= k) f = 0; int mx0 = -INF, mx1 = -INF; for(int to : g[s]) { if(to == p) continue; int x = dfs(to, s, k); if(x >= mx0) mx1 = mx0, mx0 = x; else if(x > mx1) mx1 = x; f = max(f, x + 1); } rs[2 * k] = max(rs[2 * k], mx0 + mx1 + 2 + (s != root)); return f; } int func(int u, int v) { if(sz[u] < sz[v]) swap(u, v); return min(sz[v], n - sz[v]); } vector<int> ver[N]; int lb[N]; void DFS(int s, int p) { lb[s] = B + 1; for(int to : g[s]) { if(to == p) continue; DFS(to, s); lb[s] = max(lb[to], lb[s]); } while(lb[s] <= min(sz[s], LIM)) { ver[lb[s]++].push_back(s); } } int main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin >> n; vector<pair<int, int>> edges; for(int i = 1; i < n; i++) { int a, b; cin >> a >> b; edges.push_back({a, b}); g[a].push_back(b); g[b].push_back(a); } if(n == 1) { cout << 1; return 0; } precalc(1, 1); int x0 = edges[0].first, x1 = edges[0].second; for(auto [u, v] : edges) { if(func(x0, x1) < func(u, v)) { x0 = u; x1 = v; } } LIM = func(x0, x1); g[x0].erase(find(g[x0].begin(), g[x0].end(), x1)); g[x1].erase(find(g[x1].begin(), g[x1].end(), x0)); root = n + 1; g[root].push_back(x0); g[root].push_back(x1); precalc(root, root); DFS(root, root); for(int i = 1; i <= B; i++) dfs(root, root, i); for(int i = B + 1; i <= LIM; i++) { if(ver[i].size() < 2) break; int x = ver[i][0], w = 0; for(int c : ver[i]) { if(depth[c] > depth[x]) x = c; } for(int c : ver[i]) { int v = dist(c, x) + (lca(c, x) != root); w = max(w, v); } rs[2 * i] = w; // cout << "sz=" << i << ": " << x << ' ' << y << '\n'; // if(lca(x, y) != root) rs[2 * i]++; } for(int i = 1; i <= n; i++) cout << rs[i] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...