# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
297867 | juggernaut | Split the Attractions (IOI19_split) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include"split.h"
using namespace std;
vector<int>g[100005];
pair<int,int>p[3];
int sz[100005],n,ans[100005];
int calc(int v,int p){
sz[v]=1;
for(int to:g[v])if(to!=p)sz[v]+=calc(to,v);
return sz[v];
}
int dfs(int v,int p){
for(int to:g[v])if(to!=p)
if(sz[to]>(n>>1))return dfs(to,v);
return v;
}
bool cmp(int l,int r){
return sz[l]>sz[r];
}
vector<int>zero(int n){
vector<int>ans;
while(n--)ans.push_back(0);
return ans;
}
void go(int v,int p,int cnt,int val){
if(!p[cnt].first)return;
ans[v]=val;
p[cnt].first--;
for(int to:g[v])if(to!=p)
go(to,v,cnt,val);
}
vector<int>find_split(int N,int a,int b,int c,vector<int>p1,vector<int>p2){
n=N;
p[0]={a,1};
p[1]={b,2};
p[2]={c,3};
sort(p,p+3);
for(int i=0;i<p1.size();i++){
g[p1[i]].push_back(p2[i]);
g[p2[i]].push_back(p1[i]);
}
calc(1,-1);
int root=dfs(1,-1);
calc(root,-1);
sort(g[root].begin(),g[root].end(),cmp);
if(sz[g[root][0]]<p[0].first)return zero(n);
go(g[root][0],root,0,p[0].second);
p[1].first--;
ans[root]=p[1].second;
for(int i=1;i<g[root].size();i++)go(g[root][i],root,1,p[1].second);
vector<int>vec;
for(int i=0;i<n;i++){
if(!ans[i])ans[i]=p[2].second;
vec.push_back(ans[i]);
}
return vec;
}