Submission #297752

#TimeUsernameProblemLanguageResultExecution timeMemory
297752amiratouSplit the Attractions (IOI19_split)C++14
7 / 100
684 ms1048580 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; #define sz(x) (int)(x.size()) #define fi first #define se second const int MX = (int)(1e5+5); typedef pair<int,int> ii; vector<ii> vec[MX]; vector<int> res; int s[MX],A,B,C,c_a,c_b,c_c,cnt,N; bool g; int solve(int node,int p){ int ans=1; for(auto it:vec[node]) if(it.fi!=p){ if(it.se==-1)it.se=solve(it.fi,node); ans+=it.se; } return ans; } void gimme(int node,int p,int o=0){ if(!cnt)return; cnt--; if(!o)res[node]=c_a; else res[node]=c_b; for(auto it:vec[node]) if(it.fi!=p)gimme(it.fi,node,o); } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { N=n; res.resize(n); fill(res.begin(),res.end(),0); for (int i = 0; i < n-1; ++i) { vec[p[i]].push_back({q[i],-1}); vec[q[i]].push_back({p[i],-1}); } c_a=1,c_b=2,c_c=3; if(a>b)swap(a,b),swap(c_a,c_b); if(a>c)swap(a,c),swap(c_a,c_c); if(b>c)swap(b,c),swap(c_b,c_c); A=a,B=b,C=c; for (int i = 0; i < n; ++i) { vector<ii> h; for(auto &it:vec[i]){ if(it.se==-1)it.se=solve(it.fi,i); h.push_back({it.se,it.fi}); } sort(h.begin(),h.end(),greater<ii>()); if(A==1 && h[0].fi>=B){ cnt=B,gimme(h[0].se,i,1); res[i]=c_a; g=1; break; } if(h[0].fi>=B && (h[1].fi+1)>=A){ cnt=B,gimme(h[0].se,i,1); res[i]=c_a; if(A!=1)cnt=A-1,gimme(h[1].se,i); g=1; break; } else if(h[0].fi>=A && (h[1].fi+1)>=B){ cnt=A,gimme(h[0].se,i); res[i]=c_b; if(B!=1)cnt=B-1,gimme(h[1].se,i,1); g=1; break; } } if(!g)return res; for (int i = 0; i < n; ++i) if(!res[i])res[i]=c_c; 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...