Submission #569072

#TimeUsernameProblemLanguageResultExecution timeMemory
569072minhcoolCat in a tree (BOI17_catinatree)C++17
100 / 100
103 ms38456 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define fi first #define se second #define pb push_back #define mp make_pair #define foru(i, l, r) for(int i = l; i <= r; i++) #define ford(i, r, l) for(int i = r; i >= l; i--) typedef pair<int, int> ii; typedef pair<ii, int> iii; typedef pair<ii, ii> iiii; const int N = 2e5 + 5; const int oo = 1e18 + 7, mod = 1e9 + 7; int n, d; vector<int> Adj[N]; int dp[N]; ii small[N]; void dfs(int u){ //cout << "OK " << u << "\n"; for(auto v : Adj[u]){ dfs(v); small[v].fi++, small[v].se++; } set<ii> se; for(auto v : Adj[u]){ if(small[v].fi * 2 >= d){ se.insert({small[v].fi, v}); } else{ se.insert({small[v].se, v}); } } if(!se.size()){ dp[u] = 1; small[u] = {0, oo}; return; } int mx = -oo; for(auto v : Adj[u]){ if(small[v].fi * 2 >= d){ dp[u] += dp[v]; continue; } dp[u] += (dp[v] - 1); if(small[v].fi * 2 >= d){ se.erase({small[v].fi, v}); } else{ se.erase({small[v].se, v}); } //cout << se.size() << "\n"; //if(se.size()) cout << ((*se.begin())).fi << "\n"; if(!se.size() || ((*se.begin()).fi + small[v].fi) >= d) mx = max(mx, small[v].fi); if(small[v].fi * 2 >= d){ se.insert({small[v].fi, v}); } else{ se.insert({small[v].se, v}); } } //cout << dp[u] << " " << mx << "\n"; if(mx != -oo){ dp[u]++; small[u] = {mx, (*se.begin()).fi}; } else{ small[u].fi = (*se.begin()).fi; se.erase(se.begin()); if(se.size()) small[u].se = (*se.begin()).fi; else small[u].se = oo; } //cout << dp[u] << "\n"; if(small[u].fi >= d){ dp[u]++; small[u].fi = 0, small[u].se = d; } //cout << u << " " << dp[u] << " " << small[u].fi << " " << small[u].se << "\n"; } void process(){ cin >> n >> d; //cout << n << " " << d << "\n"; for(int i = 2; i <= n; i++){ int x; cin >> x; Adj[x + 1].pb(i); //cout << x << " " << i << "\n"; } dfs(1); cout << dp[1]; } signed main(){ ios_base::sync_with_stdio(0); //freopen("cat.inp", "r", stdin); //freopen("cat.out", "w", stdout); process(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...