제출 #1031313

#제출 시각아이디문제언어결과실행 시간메모리
1031313LalicSplit the Attractions (IOI19_split)C++17
40 / 100
99 ms23464 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define all(x) x.begin(), x.end() #define allr(x) x.rbegin(), x.rend() #define mp make_pair typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef complex<double> cd; const int MAXN = 1e5+10; vector<int> proc[MAXN], adj[MAXN]; int cor[MAXN], mark[MAXN], sz[MAXN], N; void build(int ver){ mark[ver]=1; for(auto u : proc[ver]){ if(mark[u]) continue; adj[ver].pb(u); adj[u].pb(ver); build(u); } } int getSubtreeSizes(int ver, int prev=-1){ sz[ver]=1; for(auto u : adj[ver]){ if(u==prev) continue; sz[ver]+=getSubtreeSizes(u, ver); } return sz[ver]; } void setColor(int ver, int prev, int& qnt, int c){ if(!qnt) return; cor[ver]=c; qnt--; if(!qnt) return; for(auto u : adj[ver]){ if(u==prev) continue; setColor(u, ver, qnt, c); } } bool calc(int ver, int prev, int big, int small, int bc, int sc){ pii mx={N-sz[ver], prev}; for(auto u : adj[ver]){ if(u==prev) continue; mx=max(mx, {sz[u], u}); } if(mx.fi>=big && N-mx.fi>=small){ int auxsmall=small-1, auxbig=big; cor[ver]=sc; //~ cout << "bigcolor: " << bc << "\nsmallcolor: " << sc << "\n"; for(auto u : adj[ver]){ if(u==mx.se) setColor(u, ver, auxbig, bc); else setColor(u, ver, auxsmall, sc); } //~ cout << auxsmall << "\n"; return 1; } for(auto u : adj[ver]){ if(u==prev) continue; if(calc(u, ver, big, small, bc, sc)) return 1; } return 0; } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { N=n; int m=(int)p.size(); for(int i=0;i<m;i++){ proc[p[i]].pb(q[i]); proc[q[i]].pb(p[i]); } build(0); getSubtreeSizes(0); int big, small, bigcolor, smallcolor; vector<pii> temp={{a, 1}, {b, 2}, {c, 3}}; sort(all(temp)); //~ cout << "temp:\n"; //~ for(auto u : temp) cout << u.fi << " " << u.se << "\n"; big=temp[1].fi; bigcolor=temp[1].se; small=temp[0].fi; smallcolor=temp[0].se; if(!calc(0, -1, big, small, bigcolor, smallcolor)){ vector<int> resp; for(int i=0;i<n;i++) resp.pb(0); return resp; } for(int i=0;i<n;i++) if(!cor[i]) cor[i]=temp[2].se; vector<int> ans(n); for(int i=0;i<n;i++) ans[i]=cor[i]; 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...