제출 #991501

#제출 시각아이디문제언어결과실행 시간메모리
991501MarwenElarbiSplit the Attractions (IOI19_split)C++17
22 / 100
542 ms1048576 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ll long long #define pb push_back const int nax=200005; vector<int> adj[nax]; vector<pair<int,int>> nab; int aa; vector<int> res; int sz[nax]; bool test; int N; void precompute(int x,int p){ sz[x]=1; for(auto u:adj[x]){ if(u==p) continue; precompute(u,x); sz[x]+=sz[u]; } } void dfs1(int x,int p,int k){ if(nab[k].fi<=0) return; nab[k].fi--; res[x]=k+1; for(auto u:adj[x]){ if(u==p) continue; dfs1(u,x,k); } } void dfs(int x,int p){ for(auto u:adj[x]){ if(test) return; if(u==p) continue; //cout <<sz[u]<<" "<<N-sz[u]<<" "<<nab[0].fi<<" "<<nab[1].fi<<endl; if(sz[u]>=nab[0].fi&&N-sz[u]>=nab[1].fi){ test=true; dfs1(u,x,0); dfs1(x,u,1); return; }else if(sz[u]>=nab[1].fi&&N-sz[u]>=nab[0].fi){ test=true; dfs1(u,x,1); dfs1(x,u,0); return; } dfs(u,x); } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q){ N=n; nab.pb({a,1}); nab.pb({b,2}); nab.pb({c,3}); sort(nab.begin(),nab.end()); vector<int> convert(4); for (int i = 0; i < 3; ++i) convert[nab[i].se]=i+1; res.resize(n,0); for (int i = 0; i < (int)p.size(); ++i) { adj[p[i]].pb(q[i]); adj[q[i]].pb(p[i]); } precompute(0,-1); dfs(0,-1); if(!test) return res; for (int i = 0; i < n; ++i) { if(res[i]==0) res[i]=convert[3]; else res[i]=convert[res[i]]; }//cout <<endl; 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...