제출 #1201972

#제출 시각아이디문제언어결과실행 시간메모리
1201972onbertSplit the Attractions (IOI19_split)C++20
22 / 100
566 ms1114112 KiB
#include "split.h"
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int n;
vector<int> adj[maxn];

int fa[maxn], sz[maxn];
void dfs(int u, int p) {
    sz[u] = 1;
    for (int v:adj[u]) if (v != p) {
        fa[v] = u;
        dfs(v, u);
        sz[u] += sz[v];
    }
}

vector<int> ord;
void dfs2(int u, int p) {
    ord.push_back(u);
    for (int v:adj[u]) if (v != p) dfs2(v, u);
}

vector<int> find_split(int N, int a, int b, int c, vector<int> p, vector<int> q) {
    n = N;
    vector<pair<int,int>> vec = {{a, 1}, {b, 2}, {c, 3}};
    sort(vec.begin(), vec.end());
    for (int i=0;i<p.size();i++) {adj[p[i]].push_back(q[i]); adj[q[i]].push_back(p[i]);}
    fa[0] = -1;
    dfs(0, -1);

    a = vec[0].first, b = vec[1].first;
    vector<int> ans(n);
    for (int i=0;i<n;i++) {
        if (a <= sz[i] && sz[i] <= n-a) {
            if (sz[i] <= n-b) {
                for (int j=0;j<n;j++) ans[j] = vec[2].second;
                ord.clear();
                dfs2(i, fa[i]);
                for (int j=0;j<a;j++) ans[ord[j]] = vec[0].second;
                ord.clear();
                dfs2(fa[i], i);
                for (int j=0;j<b;j++) ans[ord[j]] = vec[1].second;
            } else {
                for (int j=0;j<n;j++) ans[j] = vec[2].second;
                ord.clear();
                dfs2(i, fa[i]);
                for (int j=0;j<b;j++) ans[ord[j]] = vec[1].second;
                ord.clear();
                dfs2(fa[i], i);
                for (int j=0;j<a;j++) ans[ord[j]] = vec[0].second;
            }
            return ans;
        }
    }
    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...