Submission #587876

#TimeUsernameProblemLanguageResultExecution timeMemory
587876lcjSplit the Attractions (IOI19_split)C++17
40 / 100
89 ms16524 KiB
#include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; vector<vector<int>> adj; vector<pii> subtrees; vector<int> par; vector<int> num; int cnt = 0; int dfs(int cn, int pr) { num[cn] = cnt++; par[cn] = pr; int su = 1; for (int nn : adj[cn]) { if (num[nn] != -1 && num[nn] < num[cn]) continue; su += dfs(nn, cn); } subtrees.push_back({su, cn}); return su; } vector<int> flag; void flag_arb(int cn, int &rem, int fl, bool enf = 0) { if (rem == 0) return; flag[cn] = fl; rem--; for (int nn : adj[cn]) { if (enf && num[nn] < num[cn]) continue; if (flag[nn] != 3) continue; flag_arb(nn, rem, fl); } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { adj.assign(n, {}); par.assign(n, -1); flag.assign(n, 3); num.assign(n, -1); for (int i = 0; i < (int)p.size(); i++) { adj[p[i]].push_back(q[i]); adj[q[i]].push_back(p[i]); } vector<int> res(n, 0); bool dfl = 0; dfs(0, -1); for (pii i : subtrees) { if (i.fi >= a && n-i.fi >= b) { int rem = a; flag_arb(i.se, rem, 1, 1); rem = b; flag_arb(par[i.se], rem, 2); dfl = 1; break; } if (i.fi >= b && n-i.fi >= a) { int rem = b; flag_arb(i.se, rem, 2, 1); rem = a; flag_arb(par[i.se], rem, 1); dfl = 1; break; } } if (dfl) { res = flag; } 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...