제출 #686576

#제출 시각아이디문제언어결과실행 시간메모리
686576uroskSplit the Attractions (IOI19_split)C++14
18 / 100
81 ms15004 KiB
#include "split.h"
#include <bits/stdc++.h>
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#define here cerr<<"============================================\n"
#define ll long long
#define llinf 1000000000000LL
#define sz(a) (ll)(a.size())
#define pb push_back
#define all(a) a.begin(),a.end()
#define popb pop_back
#define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;}

using namespace std;
#define maxn 100005
ll n,m;
vector<ll> g[maxn];
ll x,y,z;
ll col[maxn];
ll siz[maxn],sizmx[maxn],par[maxn];
void dfs1(ll u){
    if(!y) return;
    col[u] = 2;
    y--;
    for(ll s : g[u]) if(!col[s]) dfs1(s);
}
void dfs2(ll u){
    if(x) col[u] = 1,x--;
    else if(y) col[u] = 2,y--;
    else col[u] = 3,z--;
    for(ll s : g[u]) if(!col[s]) dfs2(s);
}
ll nod = -1; bool f;
ll dfssiz(ll u,ll p){
    siz[u] = 1;
    par[u] = p;
    for(ll s : g[u]){
        if(s!=p){
            dfssiz(s,u);
            siz[u]+=siz[s];
            sizmx[u] = max(sizmx[s],sizmx[u]);
        }
    }
    if(nod==-1){
        if(siz[u]>=x&&n-siz[u]>=y){
            nod = u; f = 1;
        }else if(siz[u]>=y&&n-siz[u]>=x){
            nod = u; f = 0;
        }
    }
    return siz[u];
}
void dfscol(ll u,ll w){
    if(!col[u]){
        if((f==1)&&(x>0)){
            col[u] = 1;
            x--;
        }
        else if((f==0)&&(y>0)){
            col[u] = 2; y--;
        }
        else col[u] = 3;
    }
    for(ll s : g[u]){
        if(s==w) continue;
        if(col[s]) continue;
        dfscol(s,w);
    }
}
vector<int> find_split(int N, int A, int B, int C, vector<int> p, vector<int> q) {
    n = N;
    m = sz(p);
    x = A,y = B,z = C;
    for(ll i = 0;i<m;i++){
        ll x = p[i],y = q[i];
        x++; y++;
        g[x].pb(y);
        g[y].pb(x);
    }
    ll mxdeg = 0,mndeg = llinf;
    for(ll i = 1;i<=n;i++) mxdeg = max(mxdeg,sz(g[i]));
    for(ll i = 1;i<=n;i++) mndeg = min(mndeg,sz(g[i]));
    if(mxdeg<=2){
        ll poc = 1;
        if(mndeg==1){
            for(ll i = 1;i<=n;i++) if(sz(g[i])==1) poc = i;
        }
        dfs2(poc);
        vector<int> ans(n);
        for(ll i = 1;i<=n;i++) ans[i-1] = col[i];
        return ans;
    }
    if(x==1){
        dfs1(1);
        for(ll i = 1;i<=n;i++){
            if(col[i]) continue;
            if(x){
                col[i] = 1;
                x--;
            }else col[i] = 3;
        }
        vector<int> ans(n);
        for(ll i = 1;i<=n;i++) ans[i-1] = col[i];
        return ans;
    }
    if(m==n-1){
        vector<ll> w = {A,B,C}; sort(all(w)); x = w[0],y = w[1],z = w[2];
        dfssiz(1,1);
        vector<int> ans(n);
        if(nod==-1) return ans;
        for(ll i = 1;i<=n;i++) col[i] = 0;
        dfscol(nod,par[nod]);
        f^=1;
        dfscol(nod,0);
        vector<ll> cur(4);
        for(ll i = 1;i<=n;i++) if(!col[i]) col[i] = 3;
        for(ll i = 1;i<=n;i++) cur[col[i]]++;
        for(ll i = 1;i<=n;i++) ans[i-1] = col[i];
        return ans;
    }
	return {};
}
#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...