Submission #268726

#TimeUsernameProblemLanguageResultExecution timeMemory
268726dooweySplit the Attractions (IOI19_split)C++14
100 / 100
207 ms32512 KiB
#include <bits/stdc++.h> #include "split.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair const int N = (int)1e5 + 10; vector<int> T[N]; vector<int> R[N]; int subt[N]; pii S[3]; bool vis[N]; vector<int> nds[N]; void dfs(int u){ vis[u]=true; subt[u]=1; for(auto x : T[u]){ if(vis[x]) continue; dfs(x); subt[u] += subt[x]; R[u].push_back(x); R[x].push_back(u); } } int id[N]; int sub[N]; int cnt; void dfs1(int u, int cc){ sub[u] = 1; id[u] = cc; nds[cc].push_back(u); for(auto x : R[u]){ if(id[x] == -1){ dfs1(x, cc); sub[u] += sub[x]; } } } vector<int> spi; void do_sp(int node, int ci){ if(spi[node] > 0) return ; if(S[ci].fi > 0){ S[ci].fi -- ; spi[node] = S[ci].se; } else{ spi[node] = S[2].se; } for(auto x : R[node]){ if((id[x] == id[node] || ci == 1) && spi[x] == 0){ do_sp(x, ci); } } } vector<pii> C[N]; int sz[N]; vector<int> idi; bool hvi[N]; int tot; int curn; int central; bool has_sol; void dfs2(int u){ hvi[u]=true; idi.push_back(u); tot += sz[u]; for(auto x : C[u]){ if(hvi[x.fi]) continue; if(has_sol) return ; if(tot + sz[x.fi] >= S[0].fi){ for(auto f : idi){ do_sp(nds[f][0], 0); } do_sp(x.se, 0); do_sp(central, 1); has_sol = true; return ; } dfs2(x.fi); } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { curn = n; int m = p.size(); S[0] = mp(a, 1); S[1] = mp(b, 2); S[2] = mp(c, 3); sort(S, S + 3); spi.resize(n); for(int i = 0 ; i < m ; i ++ ){ T[p[i]].push_back(q[i]); T[q[i]].push_back(p[i]); } dfs(0); int node = 0; int pp = -1; bool ok = true; while(ok){ ok = false; for(auto x : R[node]){ if(x != pp && subt[x] > n/2){ pp = node; node = x; ok = true; break; } } } central = node; for(int i = 0 ; i < n; i ++ ){ id[i] = -1; } id[node] = 0; for(auto x : R[node]){ cnt ++ ; dfs1(x, cnt); } for(auto x : R[node]){ if(sub[x] >= S[0].fi){ do_sp(x, 0); do_sp(node, 1); for(int i = 0; i < n; i ++ ){ if(spi[i] == 0) spi[i] = 3; } return spi; } sz[id[x]] = sub[x]; } for(int i = 0 ;i < m ; i ++ ){ if(id[p[i]] == 0 || id[q[i]] == 0 || id[p[i]] == id[q[i]]) continue; C[id[p[i]]].push_back(mp(id[q[i]], q[i])); C[id[q[i]]].push_back(mp(id[p[i]], p[i])); } for(int i = 1; i <= cnt; i ++ ){ if(hvi[i]) continue; tot = 0; idi.clear(); dfs2(i); if(has_sol){ for(int j = 0 ; j < n; j ++ ){ if(spi[j] == 0) spi[j] = S[2].se; } return spi; } } return spi; }
#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...