Submission #1294525

#TimeUsernameProblemLanguageResultExecution timeMemory
1294525Ice_manMeetings 2 (JOI21_meetings2)C++20
100 / 100
433 ms30864 KiB
/** ____ ____ ____ __________________ ____ ____ ____ ||I || ||c || ||e || || || ||M || ||a || ||n || ||__|| ||__|| ||__|| ||________________|| ||__|| ||__|| ||__|| |/__\| |/__\| |/__\| |/________________\| |/__\| |/__\| |/__\| */ #include <bits/stdc++.h> #define maxn (int)(1e6 + 10) #define PB push_back #define X first #define Y second typedef long long ll; typedef std::pair <int, int> pii; typedef std::pair <ll, ll> pll; typedef std::pair <int, ll> pil; typedef std::pair <ll, int> pli; const ll mod = 1e9 + 7; const ll INF = 1e9; std::vector <int> v[maxn]; int sz[maxn], par[maxn], op[maxn]; int osz[maxn]; int nn; void precalc(int node, int pp) { osz[node] = 1; for(auto& nb : v[node]) { if(pp == nb) continue; op[nb] = node; precalc(nb, node); osz[node] += osz[nb]; } } bool used[maxn]; void calc_sz(int node, std::vector <int>& curr) { used[node] = true; sz[node] = 1; curr.PB(node); for(auto& nb : v[node]) { if(used[nb] == true) continue; calc_sz(nb , curr); sz[node] += sz[nb]; } } int dist[maxn]; int up[maxn]; void calc_up(int node, int u) { used[node] = true; up[node] = u; for(auto& nb : v[node]) { if(used[nb] == true) continue; dist[nb] = dist[node] + 1; par[nb] = node; calc_up(nb, u); } } int ans[maxn]; void decompose(int start) { std::vector <int> curr; calc_sz(start, curr); int n = curr.size(); int cent = -1; for(auto& e : curr) { bool lamp = true; if(n - sz[e] > n / 2) continue; for(auto& nb : v[e]) if(sz[nb] < sz[e] && sz[nb] > n / 2) lamp = false; if(lamp == true) { cent = e; break; } } for(auto& e : curr) used[e] = false; used[cent] = true; par[cent] = -1; up[cent] = -1; dist[cent] = 0; for(auto& nb : v[cent]) { par[nb] = cent; dist[nb] = 1; calc_up(nb, nb); } std::vector <pii> cc; for(auto& e : curr) if(e != cent) { if(par[e] == op[e]) cc.PB({osz[e], e}); else cc.PB({nn - osz[par[e]], e}); } std::sort(cc.begin(), cc.end()); std::reverse(cc.begin(), cc.end()); pii maxx1 = {0, cent}, maxx2 = {0, cent}; for(auto& e : cc) { int val = e.X; int node = e.Y; if(maxx1.Y != up[node]) ans[val] = std::max(maxx1.X + dist[node] + 1, ans[val]); else ans[val] = std::max(maxx2.X + dist[node] + 1, ans[val]); if(maxx1.Y == up[node]) maxx1.X = std::max(dist[node], maxx1.X); else if(maxx2.Y == up[node]) maxx2.X = std::max(dist[node], maxx2.X); else if(dist[node] > maxx2.X) maxx2 = {dist[node], up[node]}; if(maxx1.X < maxx2.X) std::swap(maxx1, maxx2); } for(auto& e : curr) used[e] = false; for(auto& nb : v[cent]) { v[nb].erase(std::find(v[nb].begin() , v[nb].end() , cent)); decompose(nb); } } void read() { std::cin >> nn; for(int i = 0; i < nn - 1; i++) { int a , b; std::cin >> a >> b; v[a].PB(b); v[b].PB(a); } op[1] = -1; precalc(1 , -1); for(int i = 1; i <= nn; i++) ans[i] = 1; for(int i = 1; i <= nn; i++) used[i] = false; decompose(1); int maxx = 1; for(int i = nn / 2 - 1; i >= 1; i--) ans[i] = std::max(ans[i] , ans[i + 1]); for(int i = 1; i <= nn; i++) { if(i % 2 == 1) { std::cout << 1 << "\n"; continue; } std::cout << ans[i / 2] << "\n"; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int tests = 1; //std::cin >> tests; while(tests--) { read(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...