Submission #1070109

#TimeUsernameProblemLanguageResultExecution timeMemory
1070109j_vdd16Split the Attractions (IOI19_split)C++17
0 / 100
35 ms9852 KiB
#include "split.h"

#include <algorithm>
#include <bitset>
#include <cstdint>
#include <cstring>
#include <iostream>
#include <limits.h>
#include <math.h>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>

//#define int long long
#define loop(X, N) for(int X = 0; X < (N); X++)
#define all(V) V.begin(), V.end()
#define rall(V) V.rbegin(), V.rend()

using namespace std;

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<bool> vb;
typedef vector<vector<bool>> vvb;

int n, m;
int a, b, c;
vvi adj;
vi res;

vb vis;
vi subSize;
ii marked;
vector<ii> types;
int dfs(int node, int parent) {
    vis[node] = true;

    int maxSize = 0;
    for (int child : adj[node]) {
        if (vis[child]) continue;

        int childSz = dfs(child, node);
        maxSize = max(maxSize, childSz);

        subSize[node] += childSz;
    }
    subSize[node]++;

    if (maxSize < types[1].first && subSize[node] >= types[1].first && n - subSize[node] >= types[2].first) {
        marked = { node, parent };
    }

    return subSize[node];
}

void partition(int node, int type) {
    vis[node] = true;

    auto& [nodesLeft, value] = types[type];
    if (nodesLeft == 0) {
        type = 3;
        res[node] = 3;
    }
    else {
        nodesLeft--;
        res[node] = value;
    }

    for (int child : adj[node]) {
        if (vis[child]) continue;

        if (node == marked.first) {
            if (child == marked.second) {
                partition(child, 2);
            }
            else {
                partition(child, 1);
            }
        }
        else {
            partition(child, type);
        }
    }
}

vector<int> find_split(int _n, int _a, int _b, int _c, vector<int> p, vector<int> q) {
    n = _n, m = (int)p.size();
    adj = vvi(n);
    a = _a, b = _b, c = _c;

    loop(i, m) {
        adj[p[i]].push_back(q[i]);
        adj[q[i]].push_back(p[i]);
    }

    vis = vb(n);
    subSize = vi(n);
    marked = { -1, -1 };
    types = {{0, 0}, {a, 1}, {b, 2}, {c, 3}};
    sort(all(types));
    dfs(0, -1);

    res = vi(n);
    if (marked == ii{-1, -1}) {
        return res;
    }

    vis = vb(n, false);
    partition(marked.first, 1);
	return res;
}
#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...