제출 #425216

#제출 시각아이디문제언어결과실행 시간메모리
425216alishahali1382Split the Attractions (IOI19_split)C++14
100 / 100
166 ms16240 KiB
#include "split.h" #include<bits/stdc++.h> #pragma GCC optimize("O2") using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define debug(x) {cerr<<#x<<"="<<x<<"\n";} #define debug2(x, y) {cerr<<"{"<<#x<<", "<<#y<<"}={"<<x<<", "<<y<<"}\n";} #define debugp(p) {cerr<<#p<<"={"<<p.first<<", "<<p.second<<"}\n";} #define debugv(abcd) {cerr<<#abcd<<": ";for (auto dcba:abcd) cerr<<dcba<<", ";cerr<<"\n";} #define pb push_back #define SZ(x) ((int)x.size()) #define all(x) x.begin(), x.end() const int inf=1000001000; // 1e9 const ll INF=10000000010000000; // 1e16 const int mod=1000000007; const int MAXN=100010; vector<pair<int, char>> perm; int n, m, k, a, b, c, u, v, t, x, y, solved; int mark[MAXN], sz[MAXN], par[MAXN]; vector<int> G[MAXN]; vector<int> out; int dfs1(int node){ mark[node]=1; for (int v:G[node]) if (!mark[v]){ par[v]=node; sz[node]+=dfs1(v); } return ++sz[node]; } void dfs2(int node){ mark[node]=2; for (int v:G[node]) if (mark[v]!=2) dfs2(v); } void dfs3(int node, vector<int> &topol){ mark[node]=3; topol.pb(node); for (int v:G[node]) if (mark[v]!=3 && par[v]==node) dfs3(v, topol); } vector<int> find_split(int _n, int _a, int _b, int _c, vector<int> _p, vector<int> _q){ n=_n; out.resize(n, 0); a=_a; b=_b; c=_c; for (int i=0; i<SZ(_p); i++){ int u=_p[i], v=_q[i]; G[u].pb(v); G[v].pb(u); } perm.pb({a, 'a'}); perm.pb({b, 'b'}); perm.pb({c, 'c'}); sort(all(perm)); a=perm[0].first; b=perm[1].first; c=perm[2].first; vector<int> X, Y; dfs1(0); int v=0; for (int i=1; i<n; i++) if (sz[i]>=a && sz[i]<sz[v]) v=i; if (!v) return out; // -1 mark[v]=2; dfs2(0); mark[v]=3; X.pb(v); dfs3(0, Y); int x=sz[v], y=n-x; for (int u:G[v]) if (par[u]==v){ if (mark[u]!=2 || x-a<sz[u]) dfs3(u, X); else{ x-=sz[u]; y+=sz[u]; dfs3(u, Y); } } if (y>=b){ for (int i=0; i<a; i++) out[X[i]]=1; for (int i=0; i<b; i++) out[Y[i]]=2; solved=1; } else if (y>=a){ for (int i=0; i<a; i++) out[Y[i]]=1; for (int i=0; i<b; i++) out[X[i]]=2; solved=1; } if (!solved) return out; for (int i=0; i<n; i++){ if (!out[i]) out[i]=3; out[i]=perm[out[i]-1].second-'a'+1; } return out; }
#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...