Submission #1210267

#TimeUsernameProblemLanguageResultExecution timeMemory
1210267NeltBeech Tree (IOI23_beechtree)C++20
0 / 100
0 ms324 KiB
#include "beechtree.h" #include <bits/stdc++.h> #define endl "\n" #define ll long long using namespace std; vector<int> beechtree(int n, int m, vector<int> P, vector<int> C) { vector<vector<pair<int,int>>> adj(n+1); set<int> colors; for(int i=0;i<n-1;i++){ int u = P[i]+1, v = i+2, col = C[i]; adj[u].push_back({v, col}); adj[v].push_back({u, col}); colors.insert(col); } int root = 1; vector<int> parent(n+1), pcol(n+1); vector<vector<pair<int,int>>> children(n+1); function<void(int,int,int)> dfs1 = [&](int x, int p, int col){ parent[x] = p; pcol[x] = col; for(auto &pr : adj[x]){ int y = pr.first, col_e = pr.second; if(y==p) continue; children[x].push_back({y, col_e}); dfs1(y, x, col_e); } }; dfs1(root, 0, 0); vector<ll> subsize(n+1); vector<unordered_map<int,ll>> childSize(n+1); bool ok = true; function<void(int)> dfs2 = [&](int x){ subsize[x] = 1; unordered_map<int,int> seen; for(auto &pr : children[x]){ int y = pr.first, col = pr.second; dfs2(y); if(++seen[col] > 1) ok = false; childSize[x][col] = subsize[y]; subsize[x] += subsize[y]; } }; dfs2(root); if(!ok) return {}; for(int col : colors){ ll smin = LLONG_MAX; for(int i=1;i<=n;i++){ auto it = childSize[i].find(col); if(it!=childSize[i].end()) smin = min(smin, subsize[i]); } if(smin==LLONG_MAX) continue; for(int i=1;i<=n;i++){ if(subsize[i] >= smin && childSize[i].count(col)==0){ ok = false; break; } } if(!ok) break; vector<pair<ll,ll>> vec; for(int i=1;i<=n;i++){ auto it = childSize[i].find(col); ll z = (it==childSize[i].end()?0:it->second); vec.push_back({subsize[i], z}); } sort(vec.begin(), vec.end()); ll last = -1; for(auto &pr : vec){ if(pr.second < last){ ok=false; break;} last=pr.second; } if(!ok) break; } if(!ok) return {}; priority_queue<pair<ll,int>> pq; pq.push({subsize[root], root}); vector<int> order; order.reserve(n); while(!pq.empty()){ auto [sz, x] = pq.top(); pq.pop(); order.push_back(x); for(auto &pr : children[x]){ pq.push({subsize[pr.first], pr.first}); } } reverse(order.begin(), order.end()); vector<int> res(n); for(int i=0;i<n;i++) res[order[i]-1] = i; return res; }
#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...