Submission #425209

#TimeUsernameProblemLanguageResultExecution timeMemory
425209alishahali1382Split the Attractions (IOI19_split)C++14
0 / 100
189 ms19088 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; vector<int> topol; 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){ // debug(node) // debugv(G[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); X.pb(v); dfs3(0, Y); mark[v]=3; int x=sz[v], y=n-x; for (int u:G[v]) if (par[u]==v){ // debug(u) if (mark[u]!=2 || x-a<sz[u]){ dfs3(u, X); continue ; } 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; // debugv(out) for (int i=0; i<n; i++){ if (!out[i]) out[i]=3; if (out[i]==1){ if (perm[0].second=='a') out[i]=1; if (perm[0].second=='b') out[i]=2; if (perm[0].second=='c') out[i]=3; } else if (out[i]==2){ if (perm[1].second=='a') out[i]=1; if (perm[1].second=='b') out[i]=2; if (perm[1].second=='c') out[i]=3; } else if (out[i]==3){ if (perm[2].second=='a') out[i]=1; if (perm[2].second=='b') out[i]=2; if (perm[2].second=='c') out[i]=3; } } for (int i=0; i<n; i++){ if (out[i]==1) _a--; if (out[i]==2) _b--; if (out[i]==3) _c--; } // assert(!_a && !_b && !_c); 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...