Submission #843829

#TimeUsernameProblemLanguageResultExecution timeMemory
843829denniskimBeech Tree (IOI23_beechtree)C++17
100 / 100
195 ms96532 KiB
#include "beechtree.h" #include <bits/stdc++.h> using namespace std; typedef int ll; typedef __int128 lll; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<ld, ld> pld; #define MAX 9223372036854775807LL #define MIN -9223372036854775807LL #define INF 0x3f3f3f3f3f3f3f3f #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10); #define sp << " " #define en << "\n" #define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end()) vector<ll> zip; vector<ll> vec[200010]; ll chk[200010]; ll siz[200010]; map<ll, ll> mp[200010]; map<ll, ll> st[200010]; ll bun[200010]; ll ans[200010]; void dfs0(ll here, ll pa) { siz[here] = 1; for(auto &i : vec[here]) { dfs0(i, here); siz[here] += siz[i]; } } void dfs(ll here, ll pa) { if((ll)vec[here].size() == 0) { mp[here][siz[here]] = here; bun[here] = here; return; } for(auto &i : vec[here]) { dfs(i, here); if(ans[i] == -1) ans[here] = -1; } if(ans[here] == -1) return; ll maxx = -1; ll w = -1; for(auto &i : vec[here]) { if(maxx < siz[i]) { maxx = siz[i]; w = i; } } bun[here] = bun[w]; for(auto &i : vec[here]) { if(i == w) continue; for(auto &j : mp[bun[i]]) { if(j.fi == 1) continue; auto p = mp[bun[here]].lower_bound(j.fi); if(p != mp[bun[here]].end()) { auto gap = (*p); ll V = gap.se; ll U = j.se; for(auto &k : st[U]) { if(st[V].find(k.fi) == st[V].end()) { ans[here] = -1; return; } if(siz[st[V][k.fi]] < siz[k.se]) { ans[here] = -1; return; } } if(gap.fi == j.fi) { for(auto &k : st[V]) { if(st[U].find(k.fi) == st[U].end()) { ans[here] = -1; return; } if(siz[st[U][k.fi]] < siz[k.se]) { ans[here] = -1; return; } } } } p = mp[bun[here]].upper_bound(j.fi); if(p != mp[bun[here]].begin()) { p--; auto gap = (*p); ll V = gap.se; ll U = j.se; for(auto &k : st[V]) { if(st[U].find(k.fi) == st[U].end()) { ans[here] = -1; return; } if(siz[st[U][k.fi]] < siz[k.se]) { ans[here] = -1; return; } } } } for(auto &j : mp[bun[i]]) mp[bun[here]][j.fi] = j.se; } auto p = mp[bun[here]].rbegin(); auto gap = (*p); ll V = gap.se; ll U = here; for(auto &k : st[V]) { if(st[U].find(k.fi) == st[U].end()) { ans[here] = -1; return; } if(siz[st[U][k.fi]] < siz[k.se]) { ans[here] = -1; return; } } if(gap.fi == siz[here]) { for(auto &k : st[V]) { if(st[U].find(k.fi) == st[U].end()) { ans[here] = -1; return; } if(siz[st[U][k.fi]] < siz[k.se]) { ans[here] = -1; return; } } } mp[bun[here]][siz[here]] = here; } vector<ll> beechtree(ll N, ll M, vector<ll> P, vector<ll> C) { for(ll i = 1 ; i < N ; i++) zip.push_back(C[i]); compress(zip); M = (ll)zip.size(); for(ll i = 1 ; i < N ; i++) C[i] = lower_bound(zip.begin(), zip.end(), C[i]) - zip.begin() + 1; for(ll i = 1 ; i < N ; i++) vec[P[i]].push_back(i); for(ll i = 0 ; i < N ; i++) { set<ll> st22; for(auto &j : vec[i]) st22.insert(C[j]); if((ll)st22.size() != (ll)vec[i].size()) ans[i] = -1; } dfs0(0, -1); for(ll i = 0 ; i < N ; i++) { for(auto &j : vec[i]) st[i][C[j]] = j; } dfs(0, -1); vector<ll> anss; for(ll i = 0 ; i < N ; i++) { if(ans[i] == -1) anss.push_back(0); else anss.push_back(1); } return anss; }
#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...
#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...