| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1063086 | Ahmed57 | Split the Attractions (IOI19_split) | C++17 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
vector<int> adj[100001];
int sz[100001],dep[100001];
void precomp(int i,int pr){
    sz[i] =1;
    dep[i] = dep[pr]+1;
    for(auto j:adj[i]){
        if(j==pr)continue;
        precomp(j,i);
        sz[i]+=sz[j];
    }
}
vector<pair<int,int>> typ[2];
void lol(int i,int pr,int uni,int passed,int de){
    typ[passed].push_back({de,i});
    for(auto j:adj[i]){
        if(j==pr)continue;
        lol(j,i,uni,passed|(j==uni),de+1);
    }
}
vector<int> find_split(int n, int a, int b, int c, vector<int> p,vector<int> q){
    for(int i = 0;i<p.size();i++){
        adj[p[i]].push_back(q[i]);
        adj[q[i]].push_back(p[i]);
    }
    int inda = 1 , indb = 2 , indc = 3;
    if(a>b){swap(a,b);swap(inda,indb);}
    if(b>c){swap(b,c);swap(indb,indc);}
    if(a>b){swap(a,b);swap(inda,indb);}
    if(b>c){swap(b,c);swap(indb,indc);}
    precomp(0,0);
    int nod = -1 , pr = -1;
    int mi = 1e9;
    for(int i = 0;i<n;i++){
        for(auto j:adj[i]){
            if(dep[j]<dep[i]){
                if(sz[i]>=a&&mi>=sz[i]){
                    nod = i;
                    pr = j;
                    mi = sz[i];
                }
            }else{
                if(n-sz[j]>=a&&mi>=n-sz[j]){
                    nod = i;
                    pr = j;
                    mi = n-sz[j];
                }
            }
        }
    }
    if(n-mi>=b){
        vector<int> ans(n,0);
        int A = mi;
        int B = n-mi;
        lol(pr,pr,nod,0,1);
        sort(typ[0].begin(),typ[0].end());
        sort(typ[1].begin(),typ[1].end());
        reverse(typ[0].begin(),typ[0].end());
        reverse(typ[1].begin(),typ[1].end());
        int lol = (n-mi)-b;
        int val = c-lol;
        for(int i = 0;i<typ[1].size();i++){
            if(i<val)ans[typ[1][i].second] = indc;
            else ans[typ[1][i].second] = inda;
        }
        for(int i = 0;i<typ[0].size();i++){
            if(i<lol)ans[typ[1][i].second] = indc;
            else ans[typ[1][i].second] = inda;
        }
        return ans;
    }else{
        vector<int> ans(n,0);
        return ans;
    }
}
