Submission #1290732

#TimeUsernameProblemLanguageResultExecution timeMemory
1290732julia_08Split the Attractions (IOI19_split)C++20
0 / 100
124 ms250484 KiB
#include <bits/stdc++.h> #include "split.h" using namespace std; const int MAXN = 2e5 + 10; vector<pair<int, int>> split; set<int> marc[MAXN]; int pre[MAXN], pos[MAXN], id[MAXN], sub[MAXN], pai[MAXN]; vector<int> adj[MAXN]; vector<int> ans; pair<int, int> possible; int n, t = 0; void dfs_1(int v, int p){ sub[v] = 1; pre[v] = ++t; id[pre[v]] = v; for(auto u : adj[v]){ if(u != p){ pai[u] = v; dfs_1(u, v); sub[v] += sub[u]; } } pos[v] = t; } void dfs_2(int v, int p){ if(sub[v] == split[0].first && !marc[split[1].first].empty()){ if(!marc[split[1].first].empty()){ possible = {v, id[*marc[split[1].first].begin()]}; } } for(auto u : adj[v]){ if(u != p){ marc[sub[v]].erase(v); marc[sub[v] - sub[u]].insert(v); dfs_2(u, v); marc[sub[v] - sub[u]].erase(v); marc[sub[v]].insert(v); } } } bool is_sub(int a, int b){ return pre[b] <= pre[a] && pos[a] <= pos[b]; } bool check(){ for(int i=1; i<=n; i++) marc[i].clear(); for(int i=0; i<n; i++) marc[sub[i]].insert(pre[i]); dfs_2(0, 0); if(possible.first != -1){ auto [v, u] = possible; for(int i=0; i<n; i++){ if(is_sub(i, v)){ ans[i] = split[0].second; } else if(is_sub(i, u)){ ans[i] = split[1].second; } else ans[i] = split[2].second; } return true; } return false; } vector<int> find_split(int n_, int a, int b, int c, vector<int> p, vector<int> q){ n = n_; ans.resize(n); for(int i=0; i<n; i++) ans[i] = 0; possible = {-1, -1}; split = {{a, 1}, {b, 2}, {c, 3}}; for(int i=0; i<(n - 1); i++){ adj[p[i]].push_back(q[i]); adj[q[i]].push_back(p[i]); } sort(split.begin(), split.end()); dfs_1(0, 0); bool ok = false; do{ ok |= check(); } while(!ok && next_permutation(split.begin(), split.end())); return ans; }
#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...