Submission #1225423

#TimeUsernameProblemLanguageResultExecution timeMemory
1225423Hamed_GhaffariSplit the Attractions (IOI19_split)C++20
100 / 100
75 ms27464 KiB
#include <bits/stdc++.h>
using namespace std;

#define mins(x, y) (x = min(x, y))

const int MXN = 1e5+5;

int n, a, b, c, la, lb, lc;
vector<int> g[MXN], ch[MXN], ans;
bool mark[MXN], bad[MXN];
int h[MXN], mn[MXN], sz[MXN];
bool flag;

void dfs_mark(int v) {
    mark[v] = 1;
    for(int u : ch[v])
        dfs_mark(u);
}

void dfs(int v, int p=-1) {
    mn[v] = h[v] = p==-1 ? 0 : h[p]+1;
    sz[v] = 1;
    for(int u : g[v])
        if(h[u]==-1) {
            ch[v].push_back(u);
            dfs(u, v);
            sz[v] += sz[u];
            mins(mn[v], mn[u]);
        }
        else if(u!=p) mins(mn[v], h[u]);
    if(!flag && sz[v]>=a) {
        flag = 1;
        int sum=1;
        for(int u : ch[v])
            if(mn[u]>=h[v])
                sum += sz[u];
        if(sum>=a) {
            if(n-sum<a) return;
            mark[v] = 1;
            for(int u : ch[v])
                if(mn[u]>=h[v])
                    dfs_mark(u);
            if(sum>=b) {
                for(int i=0; i<n; i++)
                    mark[i] ^= 1;
            }
        }
        else {
            sum = sz[v];
            for(int u : ch[v])
                if(mn[u]<h[v] && sum-sz[u]>=a) {
                    bad[u] = 1;
                    sum -= sz[u];
                }
            mark[v] = 1;
            for(int u : ch[v])
                if(!bad[u])
                    dfs_mark(u);
        }
    }
}

void dfs_a(int v) {
    ans[v] = la;
    a--;
    for(int u : g[v])
        if(a && mark[u] && !ans[u])
            dfs_a(u);
}

void dfs_b(int v) {
    ans[v] = lb;
    b--;
    for(int u : g[v])
        if(b && !mark[u] && !ans[u])
            dfs_b(u);
}

vector<int> find_split(int n, int aa, int bb, int cc, vector<int> p, vector<int> q) {
    ::n = n;
    a=aa, b=bb, c=cc;
    la=1, lb=2, lc=3;
    if(a>b) swap(a, b), swap(la, lb);
    if(b>c) swap(b, c), swap(lb, lc);
    if(a>b) swap(a, b), swap(la, lb);
    for(int i=0; i<p.size(); i++) {
        g[p[i]].push_back(q[i]);
        g[q[i]].push_back(p[i]);
    }
    memset(h, -1, sizeof(h));
    dfs(0);
    int v_a=-1, v_b=-1;
    for(int i=0; i<n; i++)
        (mark[i] ? v_a : v_b) = i;
    ans = vector<int>(n, 0);
    if(v_a==-1) return ans;
    dfs_a(v_a);
    dfs_b(v_b);
    assert(a==0);
    for(int &i : ans)
        if(!i)
            i = lc;
    return ans;
}
#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...