Submission #1195072

#TimeUsernameProblemLanguageResultExecution timeMemory
1195072badge881Team Coding (EGOI24_teamcoding)C++20
42 / 100
4122 ms843664 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; vector<vector<ll>> edges; vector<ll> pref; ll n, k, timer = 0, tin[100005], tout[100005], depth[100005]; unordered_map<ll, ll> stuff[100005]; vector<ll> depths[100005], consider, prefs[100005]; ll ans = -1, ans2 = 0; void dfs(ll a, ll d) { depths[d].push_back(a); depth[a] = d; stuff[d][pref[a]] += 1; tin[a] = timer; timer += 1; for (auto &i : edges[a]) dfs(i, d + 1); tout[a] = timer; } ll numchild(ll a, ll k) { if (!(0 <= k && k < 100005)) return 0; vector<ll> &sus = depths[k]; if (sus.size() == 0) return 0; if (depth[a] == k) return 0; ll lo = 0; ll hi = sus.size() - 1; while (lo < hi) { ll mid = (lo + hi) / 2; if (tin[sus[mid]] >= tin[a]) hi = mid; else lo = mid + 1; } ll leftp = lo; lo = 0; hi = sus.size() - 1; while (lo < hi) { ll mid = (lo + hi + 1) / 2; if (tout[sus[mid]] <= tout[a]) lo = mid; else hi = mid - 1; } ll rightp = lo; if (!(tin[a] <= tin[sus[leftp]] && tout[sus[leftp]] <= tout[a])) return 0; return max((ll)0, rightp - leftp + 1); } ll numspecialchild(ll a, ll k, ll c) { if (!(0 <= k && k < 100005)) return 0; vector<ll> &sus = depths[k]; if (sus.size() == 0) return 0; if (depth[a] == k) return 0; ll lo = 0; ll hi = sus.size() - 1; while (lo < hi) { ll mid = (lo + hi) / 2; if (tin[sus[mid]] >= tin[a]) hi = mid; else lo = mid + 1; } ll leftp = lo; lo = 0; hi = sus.size() - 1; while (lo < hi) { ll mid = (lo + hi + 1) / 2; if (tout[sus[mid]] <= tout[a]) lo = mid; else hi = mid - 1; } ll rightp = lo; ll ans = 0; if (!(tin[a] <= tin[sus[leftp]] && tout[sus[leftp]] <= tout[a])) return 0; for (ll i = leftp; i < rightp + 1; i++) { ans += (pref[sus[i]] == c); } return ans; } void solve(ll a) { ll tans = 1; ll tans2 = 0; for (auto &i : consider) { ll temp = numchild(a, i); if (temp == 0) continue; tans += min(temp, stuff[i][pref[a]]); tans2 += min(temp, stuff[i][pref[a]]) - numspecialchild(a, i, pref[a]); } if (tans > ans) ans = tans, ans2 = tans2; else if (tans == ans) ans2 = min(ans2, tans2); } void solve2(ll a) { ll tans = 1; ll tans2 = 0; for (ll i = depth[a] + 1; i < n; i++) { ll temp = numchild(a, i); if (temp == 0) break; tans += min(temp, stuff[i][pref[a]]); tans2 += min(temp, stuff[i][pref[a]]) - numspecialchild(a, i, pref[a]); } if (tans > ans) ans = tans, ans2 = tans2; else if (tans == ans) ans2 = min(ans2, tans2); } void dfs2(ll a, ll p) { if (pref[a] == p) { solve2(a); return; } for (auto &i : edges[a]) dfs2(i, p); } int main() { for (ll i = 0; i < 100005; i++) { stuff[i].reserve(1 << 10); stuff[i].max_load_factor(0.25); } scanf("%lld %lld", &n, &k); for (ll i = 0; i < n; i++) edges.push_back({}), pref.push_back(0); for (ll i = 0; i < n; i++) { scanf("%lld", &pref[i]); prefs[pref[i]].push_back(i); } for (ll i = 1; i < n; i++) { ll temp; scanf("%lld", &temp); edges[temp].push_back(i); } dfs(0, 0); for (ll p = 0; p < k; p++) { if (prefs[p].size() > 400) dfs2(0, p); else { consider.clear(); unordered_set<ll> temps; temps.reserve(1 << 18); temps.max_load_factor(0.25); for (auto &i : prefs[p]) temps.insert(depth[i]); for (auto &i : temps) consider.push_back(i); for (auto &i : prefs[p]) solve(i); } } printf("%lld %lld\n", ans, ans2); }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:171:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  171 |     scanf("%lld %lld", &n, &k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~
Main.cpp:178:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  178 |         scanf("%lld", &pref[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~
Main.cpp:184:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  184 |         scanf("%lld", &temp);
      |         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...